fgetc为什么返回int

看APUE,有道题问,下列代码在一些机器上运行正确,而在另外一些机器上不正确,解释为什么。

int main()
{
    char c;
    while( (c = getchar())  != EOF)
        putchar(c);
}

首先看一下,为什么getchar()要返回int?getchar()读取一个字符,这个字符可以是任何值。假如返回unsigned char的话,返回值可能是0x00 ~ 0xFF中任何一个。同时,要考虑下,出错的情况下要返回一个值,这个出错的返回值不能是任何可能的字符。于是返回unsigned char不能达到要求。同理,返回char也不行。原因是unsigned char 和char都无法用一个值来表明出错情况。写标准库的人想到一个办法,将返回值扩展成int(从unsigned char转换)。这样的话,读取任何字符成功的话肯定返回正值,于是我们就可以定义出错情况返回一个负值了。一般都把EOF定义成-1。


回到这个问题,把getchar()返回值赋给char,做了截断。如果某个系统EOF定义成-129的话,并且getchar确实返回EOF, 但是当它赋值给char c的时候截断成127了。于是c != EOF判定true,执行putchar(c),接着再循环getchar(),应该会出错。


把getchar()返回值赋给char,还有个问题,假如EOF定义成-1,某时刻从文件读入0xFF,while语句会误认为结束。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值