在阅读Dennis Ritchie的书时,我发现最好将getchar()
函数返回的值存储在C中的整数类型变量而不是字符类型变量中。它说的原因是字符类型变量不能存储EOF
的值。在实际实现它的同时,将返回存储在char类型变量中没有那么困难。 getchar()函数最初返回什么,charcter或字符的ascii值?
答案 0 :(得分:0)
EOF是文件的结尾。在实现某些文件读/写操作/代码之前,您不会看到差异。
答案 1 :(得分:0)
EOF
的值始终定义为-1。
这很有效,因为所有ASCII
代码都是正数,因此它可能不会与任何真实角色的代表冲突。
不幸的是,C
有一个非常奇怪的功能,可能会导致麻烦。未定义char变量的可能值范围必须是什么。在某些系统上它是-128到+127,这很好;但在其他系统上它是0到+255,这对于普通的ASCII值来说很好,但对于EOF' s来说并不那么热。
首先,保留getchar()
的返回值的变量必须是int
。 EOF
是来自out of band
的{{1}}返回值:它与getchar()
可以返回的所有可能的char值不同。 (在现代系统中,它不反映存储在文件中的任何实际文件结束字符;它是一个信号,表示没有更多字符可用。)getchar()
的返回值必须存储在一个大于char的变量,以便它可以保存所有可能的char值,以及EOF。
如果像上面的片段中那样将getchar()
的返回值分配给char,则可能出现两种失败模式。
getchar()
类型为char
,并且signed
定义为EOF
(通常为-1
,则小数值为255
的字符( C
中的' \ 377'或' \ xff'将被符号扩展并将等于EOF
,过早地终止input.t char
类型为unsigned
,则实际EOF
值将截断(通过丢弃其高阶位,可能会导致{{ 1}}或255
)并且不会被识别为0xff
,从而导致无限输入。如果字符已签名且输入为全部7位字符,则该错误很长时间都不会被检测到。 (普通字符是有符号还是无符号是实现定义的。)
参考文献:
K& R1 Sec。 1.5 p。 14
K& R2 Sec。 1.5.1 p。 16
ISO Sec。
6.1.2.5,Sec。 7.9.1,Sec。 7.9.7.5
H& S Sec。 5.1.3 p。 116,Sec。 15.1,Sec。 15.6
CT& P Sec。 5.1 p。 70 PCS Sec。 11 p。 157
通常最好将EOF
的结果存储在int中,以保证getchar()
得到妥善处理。