null终止一个字符串

时间:2010-05-26 08:02:54

标签: c

gcc 4.4.4 c89

null终止字符串的标准方法是什么?当我使用NULL时,我收到一条警告信息。

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */

源代码:

size_t s_strscpy(char *dest, const char *src, const size_t len)
{
    /* Copy the contents from src to dest */
    size_t i = 0;
    for(i = 0; i < len; i++)
    *dest++ = *src++;

    /* Null terminate dest */
     *dest++ = 0; 

    return i;
}

另一个问题:我故意注释掉null终止的那一行。但是,它仍然正确地打印出dest的内容。此函数的调用者将通过包括NULL或不包括字符串的长度发送。即strlen(src) + 1stlen(src)

size_t s_strscpy(char *dest, const char *src, const size_t len)
{
    /* Copy the contents from src to dest */
    size_t i = 0;
    /* Don't copy the null terminator */
    for(i = 0; i < len - 1; i++)
    *dest++ = *src++;

    /* Don't add the Null terminator */
    /* *dest++ = 0; */

    return i;
}

4 个答案:

答案 0 :(得分:35)

关于你的第一个问题: 我会选择Paul R的评论并以'\0'结束。但值0本身也很好。品味问题。但是不要使用用于指针的MACRO NULL

关于你的第二个问题: 如果您的字符串未以\0终止,则它仍可能会打印预期的输出,因为您的字符串后面的内容是不可打印的字符。这是一个非常讨厌的错误,因为当你可能没想到它时它可能会爆炸。 始终使用'\0'终止字符串。

答案 1 :(得分:17)

来自comp.lang.c FAQ:http://c-faq.com/null/varieties.html

实质上:NULL(空指针的预处理器宏)与NUL(空字符)不同。

答案 2 :(得分:13)

非常小心:NULL是一个主要用于指针的宏。终止字符串的标准方式是:

char *buffer;
...
buffer[end_position] = '\0';

这(下面)也可以,但是将整数值赋值给int / short / long数组和赋值字符值并没有太大的区别。这就是为什么第一个版本是首选的,我个人更喜欢它。

buffer[end_position] = 0; 

答案 3 :(得分:7)

'\ 0'是要走的路。它是一个字符,它是字符串中所需的字符,并且具有空值。

当我们在C / C ++中说空终止字符串时,它实际上意味着'零终止字符串'。 NULL宏不用于终止字符串。