我正在使用K& S的第二版The C Programming Language。 R.
在pg上的示例程序中。 29,作者创建了一个名为getline()
的函数,其目的是计算一行中的字符数,并在行的末尾添加'\0'
(在换行符{{1}之后) })。
我的问题是,你为什么要那样做?难道你不能通过换行符来弄清楚换行符的开头吗?
答案 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',程序有时可能会在字符串后面返回随机字符。