标题几乎说明了一切,但是: 1.我正在阅读有关字符序列的教程,遇到了一个我不太懂的部分。它们在末尾初始化一个带有空字符的字符数组,如下所示:
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
然而,他们并没有真正解释有关null字符的任何进一步解释(我也尝试使用谷歌但遗憾的是我找不到我想要的答案)。教程说
“按照惯例,字符序列中表示的字符串结尾 用特殊字符表示:空字符“
对我来说意味着“大部分时间但不是每次都使用空字符”。 所以我的第一个问题是 - 什么时候使用空字符,你何时知道你是否必须明确输入它?
2 ..我有这段代码:
char foo[22] = { 'H', 'e', 'l', 'l', 'o' };
cout << foo << endl;
输出为:Hello
但是这没有我添加空字符,并且在教程中,他们在结尾处初始化了一个带有空字符的数组,正如我之前所示,尽管两个示例的输出完全相同? :/
所以我的第二个问题是 - 空字符实际上是什么?
谢谢,非常感谢您的时间!
答案 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!