ISO C字符串串联结尾处不需要的@字符

时间:2019-05-17 20:45:39

标签: c

此代码显示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);
}

2 个答案:

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