null终止一个字符串

ant*_*009 27 c

gcc 4.4.4 c89

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

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */
Run Code Online (Sandbox Code Playgroud)

源代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

另一个问题:我故意注释掉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;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*cas 36

对于你的第一个问题:我会选择保罗R的评论并终止'\0'.但价值0本身也很好.品味问题.但是不要使用NULL用于指针的MACRO .

对于你的第二个问题:如果你的字符串没有被终止\0,它可能仍会打印预期的输出,因为你的字符串是你内存中不可打印的字符.这是一个非常讨厌的错误,因为当你可能没想到它时它可能会爆炸.总是'\0'.终止字符串.


jam*_*lin 17

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

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

  • +1; 它总是让我感到困惑,我看到"以NULL结尾的字符串":哎呀,字符串终结符不是NULL,它是NUL! (10认同)

INS*_*INS 13

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

char *buffer;
...
buffer[end_position] = '\0';
Run Code Online (Sandbox Code Playgroud)

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

buffer[end_position] = 0; 
Run Code Online (Sandbox Code Playgroud)


Sco*_*ham 7

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

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

  • 我仔细检查:在一个.c文件中它是4,而在.cpp文件中,或者用g ++,它是1.问题被标记为C,而不是C++. (6认同)
  • @Scott 在 C 中,`\0` 在 `int` 中。尝试在 **C** 编译器上运行:`printf("%zu\n", sizeof ('\0'));` 当然你的结果会大于 1。 (2认同)