我之前上 stackoverflow 查证过字符串的结尾是'0'-terminate啊, 如下引用. 但是今天查 string 的, 上面图片里的官方文档的说法又都变成了 null-terminated 了. 希望大家解答下, 谢谢
null-terminated
‘0’ terminate a string, not NULL, the NULL macro isn’t intended for use in terminating strings.----(左边包含了链接)
认证0级讲师
如果是char*的字符串,库函数都是默认以'\0'结尾。如果是std::string,是作为串的形式的,并没有以'\0'结尾的规定,因为string已经重载了operator <<,所以不存在需要用'\0'结尾的问题。实际上,即使std::string里面的字符包含了'\0',string::operator << 也会一视同仁,继续输出后面的。
#include <string> #include <iostream> int main() { std::string s = "hello"; s[1] = '\0'; std::cout << s << std::endl; return 0; }
输出:h llo
所谓 null-terminated 中的 null 指的应该是 ASCII 字符集里的 NUL,其编码是数字 0,在 C 语言里是 '\0',本质是一个 char。而 C 语言里 NULL 这个宏指的是空指针,也就是 ((void*)0),是一个指针类型。两者类型不同,本质上是不同的概念,用途也不同。你引用的 stackoverflow 上的原贴讨论的应该是这个问题。
null
NUL
'\0'
char
NULL
((void*)0)
stackoverflow
如果是char*的字符串,库函数都是默认以'\0'结尾。
如果是std::string,是作为串的形式的,并没有以'\0'结尾的规定,因为string已经重载了operator <<,所以不存在需要用'\0'结尾的问题。
实际上,即使std::string里面的字符包含了'\0',string::operator << 也会一视同仁,继续输出后面的。
输出:h llo
所谓
null-terminated
中的null
指的应该是 ASCII 字符集里的NUL
,其编码是数字 0,在 C 语言里是'\0'
,本质是一个char
。而 C 语言里
NULL
这个宏指的是空指针,也就是((void*)0)
,是一个指针类型。两者类型不同,本质上是不同的概念,用途也不同。
你引用的
stackoverflow
上的原贴讨论的应该是这个问题。