在过去的几天里,我一直在自学 C++,为我大一的 CS 专业做准备。我现在在 C 风格的字符串上,想知道空终止符的意义是什么。
我知道这是必要的,但我想我只是从根本上不理解为什么一个字符串不会仅仅以它的最后一个字符结尾。
在过去的几天里,我一直在自学 C++,为我大一的 CS 专业做准备。我现在在 C 风格的字符串上,想知道空终止符的意义是什么。
我知道这是必要的,但我想我只是从根本上不理解为什么一个字符串不会仅仅以它的最后一个字符结尾。
我只是从根本上不明白为什么一个字符串不会在它的最后一个字符上结束。
有几种方法可以知道“最后一个字符”在哪里:
C选择第二条路线;其他语言(Pascal 等)选择第一条路线。C++ 的一些实现std::string
选择了第三条路线*。
std::string
是使用第一种或第三种方法的实现也会终止其缓冲区以与库的 C 部分兼容。这是确保c_str()
返回有效的 C 字符串所必需的。
在 C 和 C++ 中,c 字符串存储在字符数组中。为了允许不同长度的字符串,这些数组的分配通常比它们要包含的实际字符串大得多。例如,程序员可以分配一个char[256]
数组,该数组可以保存长度在 0 到 255 之间的字符串。但是计算机必须能够准确地知道字符串的实际长度,因此它必须以空字符结尾. 否则,字符数组长度必须与字符串完全相同(这是一种不切实际的解决方案,因为分配和复制内存会占用大量资源)。
因为 c 风格的字符串不知道最后一个字符是什么字符。例如,如果您正在读取一个名称,您可能会像这样创建一个缓冲区:
char buf[256] // this allows c-style strings that contain 255 characters
但是,当您填充该缓冲区时,您可能不会(可能不会)使用所有空间。如果你用“Jack”填充它,你关心的唯一信息是前五个索引,而不是全部 256。
将字符串的每个字符视为内存中的内存块。如果一个字符串被放置在内存中。之后将另一个字符串与其相邻放置,然后计算机将认为第二个字符串连接到第一个字符串,如果不存在 null。因此,null 充当分隔符