存储int中的值与从C

时间:2015-07-01 05:11:41

标签: c computer-science eof getchar

在阅读Dennis Ritchie的书时,我发现最好将getchar()函数返回的值存储在C中的整数类型变量而不是字符类型变量中。它说的原因是字符类型变量不能存储EOF的值。在实际实现它的同时,将返回存储在char类型变量中没有那么困难。 getchar()函数最初返回什么,charcter或字符的ascii值?

2 个答案:

答案 0 :(得分:0)

EOF是文件的结尾。在实现某些文件读/写操作/代码之前,您不会看到差异。

答案 1 :(得分:0)

EOF的值始终定义为-1。

这很有效,因为所有ASCII代码都是正数,因此它可能不会与任何真实角色的代表冲突。

不幸的是,C有一个非常奇怪的功能,可能会导致麻烦。未定义char变量的可能值范围必须是什么。在某些系统上它是-128到+127,这很好;但在其他系统上它是0到+255,这对于普通的ASCII值来说很好,但对于EOF' s来说并不那么热。

首先,保留getchar()的返回值的变量必须是intEOF是来自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()得到妥善处理。