eof怎么结束输入_getchar 怎么和 EOF 纠缠不清了?

各位,今天看了一个典型的代码错误,比较有代表性,而且这也是大多数人在C编程中经常忽略的问题之一,拿出来与大家分享,希望大家以后避免类似的错误,代码如下:

char c;while((c=getchar())!=EOF){...}

这段代码的本意是用getchar函数读取缓冲区字符直到结束,但是在编译运行时,发现上面几行代码一直报错!逻辑上没问题啊,那这究竟错在哪里?读者可以自己思考一下再往下看。

其实产生报错的原因有两点,一个是对getchar函数理解不到位,另一个是EOF的问题。

我们首先来说说getchar函数的问题,标准库中给出了该函数的使用说明:在它读取一个字符后,会将其转换为int类型返回,所以首先char c要改为int c,关于getchar的问题还没讲完,后面还要说。

我们接着来看看EOF的问题,初学者对它的理解经常会有偏差:首先它是一个宏,定义于头文件,为-1;其次它并不是很多人理解的文件结束符,实际上它是一个标志位,区别于其他所有字符的存在,表示一种没有其他字符的信号。

讲到这里,我们再回到getchar函数,由上面可以看出它的返回值必须是一个能包含所有字符的数据类型,方便它表示任意字符和EOF等标志位。

因此,上面代码的错误就很明显了,可能有两种情况:

1.如果编译器中的char是有符号的且EOF被定义为-1,而恰好有字符等于0xff,那么getchar就会提前结束。当然,如果输入全部是7位以下的字符,那很长时间不会有错误。

2.如果编译器中的char是无符号的,则实际的EOF值会被截断,不再会识别为EOF,将会陷入无限循环。

这里肯定会有人问我们键入-1来模拟EOF跳出循环不行吗?实际上是不行的,-1是有-和1两个字符组成的,而getchar一次只能读取一个字符,所以上述代码EOF与从键盘输入的字符无关,那这岂不是只能死循环了?当然不是,我们可以通过按键组合ctrl+d或者ctrl+z来指示结束,当然,这里的按键组合输入只是我们的一种约定,不应该显示检查按键组合的值。

讲到这里大家应该明白了吧,希望对大家有所帮助,感谢耐心阅读!

c96392aad3a1789dae649aebc61f3eb4.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值