返回整数的getchar函数
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:看似正常(纯属巧合)
程序在你的电脑上跑得好好的,但在你朋友的电脑上就崩了。这种“随机性”是程序员最害怕的噩梦。