我正在使用K& R的第二版C编程语言。
在pg上的示例程序中。29,作者创建了一个名为getline()的函数,其目的是计算一行中的字符数,并将'\0'附加到行尾(在换行符'\n'之后)。
我的问题是,你为什么要这么做?你不能根据你有换行符的事实来判断换行符的开始吗?
发布于 2014-04-11 01:58:42
我认为这样做的目的是将文本拆分成行。
在C数据模型中,\0标记字符串的结尾。您可以获得一个由\n表示的包含多行的字符串,但它的末尾将只有一个\0。
如果在每个\n后面都放一个\0,那么实际上就是将字符串拆分成几行,每行对应一个\0-terminated字符串。
发布于 2014-04-11 01:56:15
在C语言中,没有确切的字符串类型(例如,在Java或C#中)。对于C,它只是一个字节序列,直到找到一个0字节。这称为NUL结尾的字符串(不要与NULL常量混淆)或零结尾的字符串。
因此,添加\0是为了使其成为表示一行的有效C字符串,并能够在之后像处理普通C字符串一样对其进行操作(例如使用strlen函数)。如果不附加\0,字符数将会错误,因为您不知道字符串的结束位置。为了说明这一点,这里有一个例子:
如果看一下内存中包含"Hello“的C字符串,我们会发现:
48 65 6C 6C
6F 00 A4 0048 65 6C 6C 6F是"Hello",加上一个00字节(\0)来终止它。所以为了计算有多少个字符,我们只计算字节数,直到一个00字节结束它,也就是5个字节(5个字符)。
如果不对字符串进行零终止,那么就无法知道字符串有多少个字符。对于非零终止的"Hello“字符串,内存将如下所示:
48 65 6C 6C
6F A4 00 FF正如您所看到的,没有办法知道字符串的结束位置,因此,不可能计算它有多少字节。
发布于 2014-04-11 01:58:59
\0字符的出现与newline无关(在二进制流中并不总是\n -请参阅Keith Thompson的注释)。
换行符用于屏幕格式化(根据平台,用换行符和/或回车符以二进制表示);而\0用于标记字符串的结尾,在C中,字符串只是一个字符数组,没有固有的结尾。
https://stackoverflow.com/questions/22995493
复制相似问题