2013-06-28 61 views
4

最近几天我一直在教自己C++,为大一作为CS专业做准备。我现在使用C风格的字符串,并且想知道空终止符是什么。为什么需要空终止符?

我明白这是必要的,但我想我只是不能从根本上理解为什么字符串不会仅仅结束它的最后一个字符。

+3

你怎么知道最后一个字符是什么? – SLaks

+1

你需要一个商定的最后一个字符,在C中它是一个0字节。在ASM中,它通常是一个$ char。你知道最后一个字符,但编译器怎么知道你在想什么? – 2013-06-28 18:30:26

回答

17

我只是不能从根本上理解为什么一个字符串不会仅仅结束它的最后一个字符。

有知道哪里是“最后一个字符”的几种方式:

  1. 存储指示最后从字符串的字符分别在字符串中的字符数,
  2. 将一个标记字符串的字符,或者
  3. 将指针存储到与字符串字符分开的字符串的最后一个字符。

C选择第二条路线;其他语言(帕斯卡尔等)选择第一条路线。 C++ std::string的一些实现选择第三条路线*


*即使 std::string使用第一种或第三种方法的实现方式为了与库的C部分兼容,将它们的缓冲区终止为空。这是确保 c_str()返回有效的C字符串所必需的。

+1

4.使所有字符串固定大小的数组,可能填充空格。但是这种疯狂只能在Fortran中忍受。 – cmaster

+0

我认为应该指出,即使C++'string'出于效率的原因通常使用第一个解决方案(或第三个解决方案),以便在每次需要时不必重新计算字符串长度,它仍然会使用第二种解决方案也是为了保持字符串与C API兼容(假设“字符串”不包含空字符,与'string :: size()'相比,它与C++'string'合法,但缩短了'strlen')。 - 至少在调用'string :: c_str()'时(即使大多数实现可能只在字符串大小发生变化时才写入空终止符)。 – syam

+0

@syam这是一个很棒的评论,我编辑了包含它的答案。谢谢! – dasblinkenlight

0

因为c样式的字符串不知道什么字符是最后一个字符。例如,如果你正在阅读的名称,你可以打一个缓冲区,像这样:

char buf[256] // this allows c-style strings that contain 255 characters 

但是当你去填充该缓冲区,你可能不会(可能不会)使用的所有空间。如果用“Jack”填充它,则唯一关心的是前五个索引,而不是全部256.

2

在C和C++中,c字符串存储在字符数组中。为了允许不同长度的字符串,这些数组通常被分配得比它们要包含的实际字符串大得多。例如,程序员可以分配一个char[256]数组,该数组可以包含长度为0到255之间任意长度的字符串。但计算机必须能够确切地知道字符串实际上有多长,因此它必须以null字符。否则,需要字符数组长度与字符串完全相同(一种不切实际的解决方案,因为分配和复制内存使用了大量资源)。

0

将字符串的每个字符视为内存中的内存块。 如果一个字符串放在内存中。之后,另一个字符串被放置在它的旁边,那么计算机会认为第二个字符串与第一个字符串相连,如果null不存在的话。所以,null作为分隔符