题目:
以上介绍的getch与ungetch函数不能正确地处理压回的EOF。考虑压回EOF时应该如何处理?请实现你的方案。
自我解答:
getch和ungetch不能正确处理EOF的原因是,EOF的值是-1,而buf定义的类型是char型,在某些类型的计算机中,char定义的unsigned类型。
所以一个简单的解决方法是把char buf[BUFSIZE] 数组的类型定义为int型。
参考答案:
解决方法亦是把数组buf的类型声明为int型(程序省略)
在原先的getch和ungetch函数(参见教材第67页)中,输入缓冲区buf被声明为一个字符数组:
char buf[BUFSIZE]
C语言不要求cha变量是signed或unsigned类型的(参见教材第34页);当把一个char型变量转换为int类型时,转换结果不应该是一个负值。在某些机器上,如果一个char类型变量的最高(左)二进制位为1,那么在把它转换为一个整数的时候,就可能得到一个负数的结果。在另外一些机器上,当需要把一个char类型变量转换为一个整数的时候,系统会在它的最高(左)二进制位上添加一些0——不管将被转换的char类型变量的最高位是1还是0,这种转换结果将永远是一个正数。
我们知道,十进制的-1将被表示为十六进制的0xFFFF(假设这是一台16位的系统)。当把0xFFFF保存到一个char类型变量去时,实际保存的数字将是0xFF。当把0xFF转换为一个整数的时候,它可能被转换为0x00FF(十进制的255),也可能转换为0xFFFF(十进制-1)。整个过程如下所示:
负数(-1) -> 字符 -> 整数
0xFFFF 0xFF 0x00FF(255)
0xFFFF 0xFF 0xFFFF(-1)
如果打算像对待其他字符那样对待EOF(-1),就应该把输入缓冲区buf声明为一个整数数组:
int buf[BUFSIZE];
这样,就不需要上面提到的那些转换,而EOF(-1)或其他任何负数也都能得到正确的处理。