何时使用零字符以及它做什么

When is null character being used and what does it do?

本文关键字:什么 字符 何时使      更新时间:2023-10-16

标题几乎说明了一切:1.我正在阅读有关角色序列的教程,并遇到了我不太了解的部分。他们像这样初始初始用带有空字符的字符来:

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

但是,他们并没有真正对无效字符进行任何进一步的解释(我也尝试使用Google,但可悲的是我没有找到我想要的答案)。教程说

"按照惯例,字符串的末端以字符序列表示 由特殊字符发出信号:零字符"

对我来说,这意味着"大多数时候但并非每次都使用一个无效的字符"。所以我的第一个问题是 - 何时使用空字符,什么时候知道您是否必须明确输入它?

2 ..我有此代码:

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

输出在哪里:你好

但这是没有我添加空字符的,在教程中,它们在末尾以无效字符初始化了阵列,即使我以前显示的两个示例的输出完全相同?:/

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

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

''是零终止字符。没有这个,您将无法知道字符串何时结束。在您的示例中

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

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

''的17倍。输出字符串时,您可能会有类似的东西:

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

何时使用空字符

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

什么时候知道您是否必须明确输入

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

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

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

但是,您的字符数组包含在您明确初始化的字符之后的nulls。这是因为价值初始化设置字符,而无需明确的初始化器。

实际上是什么?

是什么?

它指定了零终止字符串的末端。


并非所有字符序列null终止字符序列

如果字符序列以空终止字符结束,则根据定义将其终止。您可以将此类序列用作参数,以对std::strlen等标准函数。

但否:字符序列不一定包含空字符。不包含空字符的字符序列不是按定义终止的,不得用作期望终止字符串的函数的参数。一个例子:

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