'\0'代表什么意思?

27

我不明白下面代码中两处不同位置中的 '\0' 分别代表什么意思:

string x = "hhhdef\n";
cout << x << endl;
x[3]='\0';
cout << x << endl;
cout<<"hhh\0defef\n"<<endl;

结果:

hhhdef

hhhef

hhh

有人能给我一些指导吗?

6个回答

37

C++ 的 std::string 是“计数”字符串——也就是说,它们的长度会以整数形式存储,并且可以包含任何字符。当你用 \0 替换第三个字符时,不会发生特殊情况——它会被打印为任何其他字符一样(特别地,你的控制台只是忽略它)。

然而,在最后一行中,你正在打印一个 C 字符串,其结尾由找到的第一个 \0 确定。在这种情况下,cout 会继续打印字符,直到它找到一个 \0,而在你的情况中,这个 \0 是在第三个 h 后面的。


13

C++有两种字符串类型:

内置的C风格的以null结尾的字符串,实质上只是字节数组;C++标准库中的std::string类,不是以null结尾。

打印以null结尾的字符串只会打印到第一个null字符为止。打印std::string会打印整个字符串,无论其中间是否有null字符。


1
从错误中学习。 @LearnedfromMistake,你的用户名真贴切。;-) - Konrad Rudolph

12

\0 是空字符,在 ASCII 表中可以找到它,它的值为 0。

它用于确定 C 风格字符串的结尾。

然而,C++ 类 std::string 将其大小存储为整数,因此不依赖于它。


5
您在此处使用了两种不同的字符串表示方法,这就是行为差异的原因。
第二种更容易解释;它是C风格的原始char数组。在C风格字符串中,'\0'表示null终止符;它用于标记字符串的结束。因此,任何处理/显示字符串的函数一旦遇到null终止符就会停止(这就是为什么您的最后一个字符串被截断)。
第一个示例创建了一个完整的C++ std::string对象。这些对象没有将'\0'分配给任何特殊含义(它们没有null终止符)。

3
\0被视为NULL字符。在C语言中,它用于标记字符串的结尾。
在C语言中,字符串是指向以\0结尾的字符数组的指针。因此,以下是C语言中有效表示字符串的方式。
char *c =”Hello”;    // it is actually Hello\0
char c[] = {‘Y’,’o’,’\0′};

‘\0’的应用在于确定字符串的结尾。例如:查找字符串的长度。


C++字符串的行为怎么样? - HolyBlackCat

1

\0基本上是一个空终止符,用于C语言中终止字符串字符的末尾。简单来说,它的值为null,基本上给编译器指示这是字符串字符的结尾。 让我举个例子 - 当我们写printf("Hello World"); /* Hello World\0 在这里,我们可以清楚地看到\0充当了null的作用,虽然在注释中打印字符串会给出相同的输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接