这太奇怪了。看来,根据我首先声明/初始化的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
。有什么理由可能会发生这种情况?
答案 0 :(得分:2)
这是因为几个问题:
t_str
(和ran_str
)只有1个字节长。 (空终结符)inbuf
中没有空格,因此循环永不结束。因为ran_str
在t_str
之后立即声明它在内存之后,所以当strncat
溢出t_str
缓冲区时它会写入ran_str
。
您需要为t_str
(可能还有ran_str
)分配更多内存,并检查您是否没有溢出它们。您还需要通过检查是否未到达空终止符来确保您没有读过inbuf
的末尾。
答案 1 :(得分:1)
Culprit是您定义数组的代码:
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]="";
答案 2 :(得分:0)
当你这样做时:
char t_str[] = "";
数组只包含1个字符,足以容纳尾随空字节。然后当你这样做:
strncat(t_str, &inbuf[pos], 1);
它将一个字符复制到t_str
(覆盖空值),然后将一个空字节附加到它。这意味着它在数组范围之外写入,这是未定义的行为。在您的实现中,它似乎覆盖了ran_str
的开头。
strncat
的第三个参数应始终比目标数组中剩余的空间少1,以便为将要追加的空值留出空间。所以它应该是:
strncat(t_str, &inbuf[pos], sizeof(t_str)-strlen(t_str)-1);