什么是空终止字符串?

时间:2015-06-20 20:42:14

标签: string

这个问题取自Cracking the Coding Interview book,问题陈述 - 写一个程序来反转一个空终止字符串;这个术语只出现在C / C ++中吗? “null终止字符串”和Java中常用的字符串有什么区别?

2 个答案:

答案 0 :(得分:1)

以null结尾的字符串是以null('\0')字符结尾的字符串(字符序列)。

C标准将字符串定义为(引用[N1570])http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)7.1.1)as:

  

string 是由第一个空字符终止并包含第一个空字符的连续字符序列。

其中 null字符是值为0的字符(不要与数字'0'混淆)。

C标准库中的许多函数都希望参数是指向字符串的指针(定义为指向字符串初始字符的指针)。如果使用参数调用这样的函数,该参数是指向字符数组元素的指针,但该数组不包含空字符,则行为未定义。该函数可能会读取超出数组末尾的内存,直到它碰巧在内存中达到0字节,或直到它崩溃。

这是表示任意长度的字符串的几种方法之一。另一种方法是将字符串的长度与其内容一起存储为整数。某些版本的Pascal在字符串的开头使用一个字节的长度,将最大长度限制为255个字节。

C ++继承了C&C的 string 及其标准库的定义,还有一个实现std::string的库类,这是一种更抽象的类型,可以让你对字符串进行操作不必担心他们如何代表。我对Java的字符串类型不太熟悉,但我认为它类似。一个优点是你可以在字符串中间使用空字符;另一个是你可以在不搜索空终止符的情况下确定长度。

答案 1 :(得分:0)

以空字符结尾的字符串是由NUL字符(ASCII代码0)终止的字符串。在C中,没有字符串数据类型。你有炭。那你怎么做一个字符串?嗯,它本质上只是一个字符数组!现在,这里很有趣。所以在像Java这样的OO语言中,数组是具有Length或Count属性的对象或类似的东西(名称因语言/实现而不同)。在C中,它只是一个字符列表。那么,我们怎么知道我们已经到达字符串的末尾了?当我们遇到NUL字符(字节值为0)时。这让我们知道我们在字符串的末尾。

当谈到OO语言时,它们可能以NUL结尾(或提供一种方法来检索C语言兼容的空终止版本),但它们可能不会,因为它们可以使用内部的Length / Count变量来跟踪这个字符串有多长。我还要说更多" C"而不是" C / C ++"正如你所做的那样,因为在C ++中你有std :: string类,它更像Java中的字符串而不是C中的字符串。