此代码显示foobar @。这里@不应该来。我不知道为什么会来。这是ISOC。我希望有人能早点解决这个问题。
#include <stdio.h>
#include <string.h>
int main(void)
{
char *str1 = (char*)"foo";
char *str2 = (char*)"bar";
char ccat[strlen(str1)+strlen(str2)];
strncpy(&ccat[0], str1, strlen(str1));
strncpy(&ccat[strlen(str1)], str2, strlen(str2));
puts(str1);
puts(str2);
puts(ccat);
}
答案 0 :(得分:3)
请记住,在C字符串中,您需要的总长度为 NUL终止符再加上一个字节。这意味着您需要:
char ccat[strlen(str1)+strlen(str2)+1];
由于您没有为最后一个字符分配足够的空间,因此您会在其中得到随机垃圾,例如@
或其他任何东西。还是什么都没有。
第二,您阻止strncpy
应用完整的字符串,包括NUL终止符。这导致写入不完整。正确终止是必要的,因此快速解决方法是strlen(str1)+1
,但是您应该描述接收缓冲区的长度,以防止溢出,而不是所写内容的长度。 / p>
您还需要手动添加NUL终止符,或更改添加字符串的方式。这种方法可能更好:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *str1 = "foo";
char *str2 = "bar";
char ccat[strlen(str1)+strlen(str2)+1];
// The length limit on the first one is the length of the buffer - 1
strncpy(ccat, str1, sizeof(ccat)-1);
// The length limit on the second is that minus the length of what's in there
strncat(ccat, str2, sizeof(ccat)-strlen(ccat)-1);
puts(str1);
puts(str2);
puts(ccat);
return 0;
}
值得注意的是,如果您搞砸了,编译器可能会警告(-Wall
)有关常见的溢出问题,例如以下示例:
the value of the size argument in 'strncat' is too large, might lead to a buffer overflow [-Wstrncat-size]
答案 1 :(得分:-3)
unix_time = dtarray.view("i8") / 1e6