K& R C - 在换行符后添加'\ 0'

时间:2014-04-10 17:53:30

标签: c string

我正在使用K& S的第二版The C Programming Language。 R.

在pg上的示例程序中。 29,作者创建了一个名为getline()的函数,其目的是计算一行中的字符数,并在行的末尾添加'\0'(在换行符{{1}之后) })。

我的问题是,你为什么要那样做?难道你不能通过换行符来弄清楚换行符的开头吗?

4 个答案:

答案 0 :(得分:3)

我认为目的是将文本拆分为行

在C数据模型中,\0标记字符串的结尾。您可以获得一个字符串,其中包含多个由\n发出信号的行,但最后会有一个\0

如果您在\0之后放置\n,则实际上是将字符串拆分为每行一行\0 - 终止字符串。

答案 1 :(得分:1)

在C中,没有正确的字符串类型(例如在Java或C#中)。对于C,它只是一个字节序列,直到找到0字节。这称为NUL终止(不要与NULL常量混淆)或以零终止的字符串。

因此附加\0使其成为一个有效的C字符串,表示一行,并且能够在之后将其作为普通的C字符串进行操作(例如,使用strlen函数)。如果你没有追加\0,那么字符数就会出错,因为你不知道字符串的结束位置。为了表明这一点,以下是一个例子:

如果看一下包含" Hello"的C字符串在记忆中,我们发现:

48 65 6C 6C 
6F 00 A4 00

48 65 6C 6C 6F是" Hello",加上终止它的00字节(\ 0)。因此,要计算多少个字符,我们只计算字节直到终止它的00字节,即5个字节(5个字符)。

如果你没有对字符串进行零终止,那么就无法知道该字符串有多少个字符。对于非零终止的" Hello"这就是内存的样子。 string:

48 65 6C 6C 
6F A4 00 FF

正如您所看到的,无法知道字符串的结束位置,因此无法计算它有多少字节。

答案 2 :(得分:1)

\0字符的存在与newline无关(在二进制流中并不总是\n - 请参阅Keith Thompson的评论。)

换行符用于屏幕格式化(并以二进制形式表示换行符,回车符或两者,具体取决于平台);而\0用于标记字符串的结尾,在C中,只是一个字符数组,没有固有的结束。

答案 3 :(得分:0)

我同意上面的答案,'\ 0'只标记字符串的结尾,这在某些方面很重要 strcmp等功能。如果char数组中没有'\ 0',程序有时可能会在字符串后面返回随机字符。