抱歉,如果我的下面的问题听起来微不足道,但我正在努力解决"将char数组转换为字符串"的基本概念,以便在该方法中使用strstr().
基本上我有一个叫做数组的数组EUI_only[],它在我的程序的某个阶段动态填充,即
EUI_only[0] = A;
EUI_only[1] = B;
EUI_only[2] = C;
EUI_only[3] = D;
EUI_only[4] = E;
Run Code Online (Sandbox Code Playgroud)
我在程序的顶部声明EUI_only如下:
char EUI_only[];
Run Code Online (Sandbox Code Playgroud)
我可以确认EUI_only[]已成功填充,因为我在方法strstr()中使用它之前将其打印出来.
现在我有第二个数组receive_key_press_temporary_analysis_buffer,我打算在我的strstr()ie中使用,即包含类似于EUI_only中的字符的数组.
这个数组也在我的程序的某个点上动态填充,我可以在我使用它之前确认数组的内容是完整的,strstr()因为我已经打印了这个数组.
名为receive_key_press_temporary_analysis_buffer的数组内容如下所示:
receive_key_press_temporary_analysis_buffer[0] = 1;
receive_key_press_temporary_analysis_buffer[1] = 2;
receive_key_press_temporary_analysis_buffer[2] = C;
receive_key_press_temporary_analysis_buffer[3] = A;
receive_key_press_temporary_analysis_buffer[4] = B;
receive_key_press_temporary_analysis_buffer[5] = C;
receive_key_press_temporary_analysis_buffer[6] = D;
receive_key_press_temporary_analysis_buffer[7] = E;
receive_key_press_temporary_analysis_buffer[8] = 3;
receive_key_press_temporary_analysis_buffer[9] = 4;
Run Code Online (Sandbox Code Playgroud)
下面主要是我如何使用两个数组strstr():
char* is_eui_only_content_in_receive_key_press_analysis = strstr(receive_key_press_temporary_analysis_buffer, EUI_only);
printf("\n\rResult of is_eui_only_content_in_receive_key_press_analysis: %s\n\r", is_eui_only_content_in_receive_key_press_analysis);
Run Code Online (Sandbox Code Playgroud)
基本上当我打印strstr()它的结果时,它给了我:
Result of is_eui_only_content_in_receive_key_press_analysis: CDE34
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我重新初始化我的EUI_only如下:
EUI_only [] ="ABCDE";
基本上我从strstr()获得预期的结果即
Result of is_eui_only_content_in_receive_key_press_analysis: ABCDE34
Run Code Online (Sandbox Code Playgroud)
当我使用动态填充的EUI_only []数组时,为什么strstr()不会给出我预期的结果?
谢谢,亚历克斯.
如果你唯一的定义是char EUI_only[];它实际上有一个大小1.通过向其写入5个字符导致缓冲区溢出.在C中,数组不会自动调整大小; 他们有一生的固定大小.
成功打印其内容并不能证明任何事情,因为它可能发生在您写入您不拥有的内存中,但没有任何内容扰乱写入和读取之间的内存.
其次,str函数需要一个字符串.字符串的定义是一系列字符后跟一个空字符.在你的示例代码中,你没有null字符,所以即使你没有分配问题,你实际上也没有字符串; 因此功能行为不端.
当你写的时候char EUI_only[] = "ABCDE";,它正在做char EUI_only[6] = { 'A', 'B', 'C', 'D', 'E', 0 };一个字符串,所以一切都按预期工作.
更新:数组大小的原因1由C99 6.9.2"暂定定义"涵盖.行后char EUI_only[];,EUI_only有不完整的类型.对于不完整的数组类型,您可以取消引用它,但不能对其进行取消引用sizeof.您可以稍后在源文件中完成该类型; 如果不这样做,那么它的行为就像源文件的最后一行一样char EUI_only[] = { 0 };.这是C的一个很少使用的特性; 通常,您可以通过指定大小或提供初始化程序来声明完整类型.