C程序设计语言(K&R第二版):练习4-9

题目:

以上介绍的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)或其他任何负数也都能得到正确的处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值