返回整数的getchar函数

← 返回 MOC | ← 主页


1. 核心矛盾:256 个字符 vs 第 257 个信号

在计算机里,一个字节(char)有 8 位,可以表示 256 种不同的可能(0 到 255)。

  • 所有的字符 (键盘上的字母、数字、符号)都已经占满了这 256 个坑位。
  • 问题来了 :如果文件读完了,getchar 必须返回一个信号告诉程序:“没东西可读了!”这个信号就是 EOF (End Of File)。
  • 尴尬的境地 :如果 getchar 返回 char 类型,那它返回的任何一个值都对应着一个合法的字符。它根本腾不出额外的“手”来挥舞 EOF 这面旗子。

解决方案getchar 返回一个比 char 更宽的 int 。这样它就能返回 0-255 之间的字符,还能额外返回一个不在这个范围内的值(通常是 -1)来代表 EOF。


2. 书中提到的“三种惨剧”

如果你像例子里那样写 char c; c = getchar();,就会发生“强行把大象塞进冰箱”的情况,导致数据截断:

情况 A:程序提前结束(误杀)

有些合法的字符(比如某些特殊符号),它们的二进制位在截断后可能恰好变成了 -1

  • 结果 :你本来想复制整个文件,结果读到一半,程序以为到头了,直接收工,后面的内容全丢了。

情况 B:死循环(死不瞑目)

在某些系统上,char 默认是“无符号”的(0 到 255)。

  • 结果getchar 返回了 -1 (EOF),但存进 c 以后变成了 255
  • 逻辑对比255 != -1 永远成立。于是程序会疯狂打印乱码,永远停不下来,直到你强制关闭。

情况 C:看似正常(纯属巧合)

程序在你的电脑上跑得好好的,但在你朋友的电脑上就崩了。这种“随机性”是程序员最害怕的噩梦。


本章小结

111