25

我无法理解以下代码中两个不同位置的 '\0' 的含义:

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

结果:

hhhdef

呵呵

呵呵

谁能给我一些指示?

4

6 回答 6

26

C++std::string是“计数的”字符串——即,它们的长度存储为整数,并且它们可以包含任何字符。当您将第三个字符替换为\0没有什么特别之处时 - 它会像任何其他字符一样打印(特别是,您的控制台会忽略它)。

相反,在最后一行中,您正在打印一个 C 字符串,其结尾由\0找到的第一个字符串决定。在这种情况下,cout继续打印字符,直到找到 a \0,在您的情况下,它位于第三个 之后h

于 2013-01-06T15:16:55.500 回答
11

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

内置的 C 风格的以空字符结尾的字符串实际上只是字节数组和以空字符结尾的 C++ 标准库std::string类。

打印以空字符结尾的字符串会打印所有内容,直到第一个空字符为止。打印 astd::string会打印整个字符串,而不管其中间的空字符如何。

于 2013-01-06T15:16:34.153 回答
10

\0是 NULL 字符,你可以在你的 中找到它ASCII table,它的值为 0。

它用于确定 C 样式字符串的结尾。

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

于 2013-01-06T15:15:48.040 回答
4

您在这里以两种不同的方式表示字符串,这就是行为不同的原因。

第二个更容易解释;这是一个 C 风格的原始字符数组。在 C 风格的字符串中,'\0'表示空终止符;它用于标记字符串的结尾。因此,任何处理/显示字符串的函数都会在碰到它时立即停止(这就是你的最后一个字符串被截断的原因)。

第一个示例是创建一个完整的 C++std::string对象。这些没有赋予任何特殊含义'\0'(它们没有空终止符)。

于 2013-01-06T15:16:43.527 回答
2

\0视为NULL字符。它用于在 C 中标记字符串的结尾。

在 C 中,string 是一个指针,指向以\0结尾的字符数组。因此,以下将是 C 中字符串的有效表示。

char *c =”Hello”;    // it is actually Hello\0
char c[] = {‘Y’,’o’,’\0′};

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

于 2018-06-03T07:55:12.620 回答
1

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

于 2020-09-06T05:27:25.707 回答