0

这太奇怪了。似乎取决于我首先声明/初始化的 char 数组,当我在 C. 代码中的另一个数组上执行 strncat() 时,会覆盖一个空白数组:

    char t_str[]="";
    char ran_str[]="";
    ... inbuf ="8889  ";
    while (inbuf[pos]!=' ')
    {
       strncat(t_str, &inbuf[pos],1);
       printf("t_str so far: %s\n", t_str);
       printf("ran_str so far: %s\n", ran_str);
       pos++;
    }

输出:

   t_str so far: 8
   ran_str so far:
   t_str so far: 88
   ran_str so far: 8
   t_str so far: 888
   ran_str so far: 88
   t_str so far: 8889
   ran_str so far: 889

ran_str如果我之前初始化t_str,那么 ran_str[]不会像我一样被填满strncat() t_str。为什么会发生这种情况?

4

3 回答 3

2

这是因为几个问题:

  1. t_str(and ran_str) 只有 1 个字节长。(空终止符)
  2. 没有空间,inbuf所以循环永远不会结束。

因为它是在内存中紧随其后ran_str声明的,所以当缓冲区溢出时,它会写入.t_strstrncatt_strran_str

您需要为t_str(并且可能ran_str)分配更多内存并检查您没有溢出它们。inbuf您还需要通过检查您是否没有到达空终止符来确保您没有阅读到结尾。

于 2013-10-04T16:48:24.380 回答
1

罪魁祸首是您定义数组的代码:

char t_str[]="";
char ran_str[]="";

您应该为两个数组提供一个长度。在上述情况下,我认为t_str两者ran_str都会获得相邻的地址。你可以试试这个来确认:

printf("%p %p\n", t_str, ran_str);

通过使用一些长度的数组来修复它:

char t_str[10]="";
char ran_str[10]="";
于 2013-10-04T16:48:47.967 回答
0

当你这样做时:

char t_str[] = "";

该数组仅包含 1 个字符,刚好有足够的空间容纳尾随空字节。当你这样做时:

strncat(t_str, &inbuf[pos], 1);

它将一个字符复制到t_str(覆盖空),然后附加一个空字节。这意味着它在数组边界之外写入,这是未定义的行为。在您的实现中,它似乎覆盖了ran_str.

to 的第三个参数strncat应该总是比目标数组中剩余的空间小 1,以便为将要附加的空值留出空间。所以应该是:

strncat(t_str, &inbuf[pos], sizeof(t_str)-strlen(t_str)-1);
于 2013-10-04T16:51:02.337 回答