【问题标题】:"converting an a char array to a string"“将 char 数组转换为字符串”
【发布时间】:2014-04-10 10:53:40
【问题描述】:

抱歉,如果我的以下问题听起来微不足道,但我正在努力解决“将 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() 中使用它之前确认数组的内容是完整的。

这个名为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";

基本上我从 strstr() 得到预期的结果,即

Result of is_eui_only_content_in_receive_key_press_analysis: ABCDE34

为什么当我使用动态填充的 EUI_only[] 数组时 strstr() 没有给我预期的结果?

谢谢, 亚历克斯。

【问题讨论】:

  • 您的两个存档是否在数据末尾都以零结尾?
  • 你为什么描述你的代码而不是展示它?向我们隐藏代码几乎没有帮助。
  • 确保动态分配数组时应以空字符“\0”终止。当你用“ABCDE”初始化时,默认填充空字符

标签: c


【解决方案1】:

如果您唯一的定义是char EUI_only[];,那么它实际上的大小是1。通过向其中写入 5 个字符会导致缓冲区溢出。在 C 中,数组不会自动调整大小;它们的一生都有固定的尺寸。

成功打印其内容并不能证明任何事情,因为您可能会写入不属于您的内存,但在写入和读取之间没有干扰该内存。

其次,str 函数需要一个字符串。字符串的定义是一系列字符,后跟一个空字符。在您的示例代码中,您没有空字符,因此即使您没有分配问题,您实际上也没有字符串;因此该函数行为异常。

当您编写 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 的一个很少使用的特性;通常你会通过指定大小或提供初始化器来声明一个完整的类型。

【讨论】:

  • char EUI_only[]; 定义一个大小为 1 的数组?在它所包含的翻译单元中,它不是一个不完整的类型吗?
  • 是的,但是如果你没有完成就到达文件末尾,就好像你在文件末尾写了char EUI_only[] = { 0 };。参见 C99 6.9.2(“暂定定义”)。
  • 合法使用数组暂定定义:char x[]; int main() { x[5] = 1; } char x[6];
  • 非常感谢 :) 我在标准中查找了它,现在我很清楚,尽管我会说如果有人在他们的代码中使用此功能,则需要拒绝。
  • 另外,请将您的评论添加到答案中。会更清楚。
【解决方案2】:

C 字符串以 null '\0' 字符结尾

EUI_only[5] = '\0' ;

receive_key_press_temporary_analysis_buffer[10] = '\0' ;

确保在声明时为空字符留出额外的空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2013-04-25
    • 2012-11-04
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2012-05-16
    • 2012-02-16
    相关资源
    最近更新 更多