为什么我们在C ++字符串中需要一个空终止符?

问题描述

我是编程新手,还是C ++的新手,最近遇到了字符串。

为什么在字符列表的末尾需要空终止符?

我已经读过类似的答案,因为我们可能不会使用数组的所有空格,因此我们需要空终止符让程序知道字符串的结尾位置,例如char[100] = "John" 但是为什么程序不能仅循环遍历数组以检查填充了多少空格并因此决定了长度?

如果单词"John"的数组中仅填充了四个字符,那么其他空格又填充了什么?

解决方法

数组char john[100] = "John"中的其他字符将填充零, 都是 空终止符。通常,当您初始化数组而没有提供足够的元素来填充它时,其余的元素将被默认初始化:

int foo[3] {5};           // this is {5,0}
int bar[3] {};            // this is {0,0}

char john[5] = "John";    // this is {'J','o','h','n',0}
char peter[5] = "Peter";  // ERROR,initializer string too long
                          // (one null-terminator is mandatory)

另请参见cppreference on Array initialization。要找到这样的字符串的长度,我们只需遍历字符,直到找到0并退出。

C ++中以null终止的字符串背后的动机是确保与使用以null终止的字符串的C库兼容。另请参见What's the rationale for null terminated strings?

std::string这样的容器不需要以空字符结尾的字符串,甚至可以存储包含空字符的字符串。这是因为它们分别存储字符串的大小。仅C ++的库很少(如果曾经使用过)以null终止的字符串。

,

空终止符的存在是设计决定。它的作用是标记字符串的结尾。还有其他方法可以执行此操作,例如在Pascal中,字符串的第一个元素是字符串的大小,因此不需要空终止符。

在该示例中,您仅给出了数组的前5个元素将被初始化,其余元素被初始化为零的情况。注意我怎么说5个元素,而不仅仅是4个。第五个元素是空终止符。

确定程序可以在字符串中循环查找其长度,但是如何知道何时停止循环?

,

nul终止符告诉您填充了哪些空格。直到nul终止符为止的所有内容都已填充。一切都还没有。

没有普遍的概念来填充数组中的哪些元素。数组包含一些元素;其大小是在创建时确定的。最初,它的所有元素都具有一定的价值。通常,无法通过查看元素的值来确定哪些已分配值,哪些没有分配值。

字符串是char 的数组,编码约定是字符串的“结尾”用nul字符标记。大多数字符串操作函数都依赖此约定。

字符串文字,例如"John",是char的数组。 "John"在数组中有5个元素:'J''o''h''n''\0'。例如,函数strcpy复制字符,直到看到该nul终止符为止:

char result[100]; // no meaningful values here
strcpy(result,"John");

在调用strcpy之后,result的前五个元素是'J''o''h''n'和{ {1}}。其余的数组元素没有有意义的值。

如果我没有提到这种样式的字符串来自C,并且通常被称为C样式的字符串,那我会很失落。 C ++支持所有C字符串,但是它还具有更复杂的字符串概念'\0',这是完全不同的。通常,您应该使用C ++样式的字符串,而不是C样式的字符串。