null终止字符串

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或不包括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; } 

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

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

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

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

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

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

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

 buffer[end_position] = 0; 

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

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