何时使用null字符,它是做什么用的?

时间:2017-02-16 14:05:10

标签: c++

标题几乎说明了一切,但是: 1.我正在阅读有关字符序列的教程,遇到了一个我不太懂的部分。它们在末尾初始化一个带有空字符的字符数组,如下所示:

char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

然而,他们并没有真正解释有关null字符的任何进一步解释(我也尝试使用谷歌但遗憾的是我找不到我想要的答案)。教程说

  

“按照惯例,字符序列中表示的字符串结尾   用特殊字符表示:空字符“

对我来说意味着“大部分时间但不是每次都使用空字符”。 所以我的第一个问题是 - 什么时候使用空字符,你何时知道你是否必须明确输入它?

2 ..我有这段代码:

char foo[22] = { 'H', 'e', 'l', 'l', 'o' };
cout << foo << endl;

输出为:Hello

但是这没有我添加空字符,并且在教程中,他们在结尾处初始化了一个带有空字符的数组,正如我之前所示,尽管两个示例的输出完全相同? :/

所以我的第二个问题是 - 空字符实际上是什么?

谢谢,非常感谢您的时间!

2 个答案:

答案 0 :(得分:4)

'\0'是空终止字符。如果没有这个,你将无法知道字符串何时结束。在你的例子中

char foo[22] = { 'H', 'e', 'l', 'l', 'o' };

相同
char foo[22] = { 'H', 'e', 'l', 'l', 'o', '\0', '\0', ..., '\0' };

17次'\0'。当您输出字符串时,您可以使用以下内容:

auto i = 0
do
{
    // Do smoething with foo[i++]
}
while('\0' != foo[i]);

答案 1 :(得分:1)

  

何时使用空字符

每当需要以空值终止的字符串时。 我什么时候需要空终止字符串,你可能会问。好吧,每当你调用一个需要空终止字符串的函数时。函数文档中是否可以找到函数是否需要空终止字符串。此类功能的示例包括:std::strlen(const char*)operator<<(std::ostream&, const char*)和无数其他功能。

  

您何时知道是否必须明确输入

每当你需要一个空终止的字符串时,你要么知道你的字符数组不会以空终止,或者你不知道它是否会被终止。

  

即使两个例子的输出完全相同??

如果要在输出流中插入指向非空终止字符数组的指针,则程序的行为将是未定义的。

但是,您的字符数组在显式初始化的字符后面包含空值。这是因为值初始化将没有显式初始值设定项的字符设置为null。

  

空字符实际上是什么?

它指定空终止字符串的结尾。

  

并非所有字符序列都是空终止字符序列,因为它们都需要空字符来表示结束

如果字符序列以空终止字符结尾,则按定义将其终止。您可以将此类序列用作标准函数的参数,例如std::strlen

但不是:字符序列不一定包含空字符。不包含空字符的字符序列不会因定义而终止,并且不能用作期望空终止字符串的函数的参数。一个例子:

char non_terminated[] = {'h', 'i', '!'};
auto len = std::strlen(non_terminated); // oops, UB!