道歉,如果我的下面的问题听起来微不足道,但我正在努力解决"将char数组转换为字符串的基本概念"用于方法strstr()
。
基本上我有一个名为EUI_only[]
的数组,它在我程序的某个阶段动态填充,即
EUI_only[0] = A;
EUI_only[1] = B;
EUI_only[2] = C;
EUI_only[3] = D;
EUI_only[4] = E;
我在程序的顶部声明EUI_only如下:
char EUI_only[];
我可以确认EUI_only[]
已成功填充,因为我在方法strstr()中使用它之前将其打印出来。
现在我有第二个名为receive_key_press_temporary_analysis_buffer
的数组,我打算在我的strstr()
中使用,即包含与EUI_only类似的字符的数组。
这个数组也在我的程序的某个点上动态填充,我可以在strstr()
中使用它之前确认数组的内容是完整的,因为我已经打印了这个数组。 / p>
此数组的内容名为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;
以下基本上是我在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);
基本上,当我打印strstr()
的结果时,它会给我:
Result of is_eui_only_content_in_receive_key_press_analysis: CDE34
另一方面,如果我重新初始化我的EUI_only如下:
EUI_only [] =" ABCDE&#34 ;;
基本上我从strstr()得到了预期的结果,即
Result of is_eui_only_content_in_receive_key_press_analysis: ABCDE34
为什么当我使用动态填充的EUI_only []数组时,strstr()没有给出我预期的结果?
谢谢, 亚历克斯。
答案 0 :(得分:5)
如果您的唯一定义是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的一个很少使用的特性;通常,您可以通过指定大小或提供初始化程序来声明完整类型。
答案 1 :(得分:0)
C字符串以null '\0'
字符
EUI_only[5] = '\0' ;
和
receive_key_press_temporary_analysis_buffer[10] = '\0' ;
确保在声明时有空格的空格。