"将char数组转换为字符串"

时间:2014-04-10 10:53:41

标签: c

道歉,如果我的下面的问题听起来微不足道,但我正在努力解决"将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()没有给出我预期的结果?

谢谢, 亚历克斯。

2 个答案:

答案 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' ;

确保在声明时有空格的空格。