详解while((ch = getchar()) != EOF)

问题

博主在学习C语言的过程中,遇到了这么一条语句

int ch;
while((ch = getchar()) != EOF)	putchar(ch);

其运行如下图所示
在这里插入图片描述
第一行是我的键盘输入:I love UJS
第二行是我的程序输出:I love UJS

认真学过C语言的同学应该知道,getchar()仅能接收一个字符,putchar也是如此,在我看来程序的输出不应该是I love UJS,而应该是I,因为这两个函数仅能接收一个字符,其他的字符会统统扔掉。

下面我们就来解释一下,为什么putchar()可以输出一个字符串。

知识背景

在解决之前我们先来了解一下什么是缓冲输入,无缓冲输入,以及流结束符EOF

无缓冲输入:用户输入字符后,程序立刻将这个字符打印出来,比如

II  JJUU  LL  NN UUaa  AAFFEEIILLOOVVEEYYOOUU

像这样,出现了字符的回显,即输入一个字符马上打印一个字符,这个过程成为无缓冲输入

缓冲输入:用户输入字符后,字符会存入一个缓冲区中,直到用户按下Enter键,才会打印缓冲区的字符,其优点是用户可以修改输入内容,增删减改。当然,其缺点是必须要按下Enter键才能输出内容,不如无缓冲输入及时,比如在很多电子游戏中就是采用的无缓冲输入(如CS的WASD,英雄联盟的QWER)。

流结束符EOF:在编程的世界中,输入不仅仅是键盘输入,还有文件输入,流媒体输入等等一系列的输入,那么计算机是如何来判定程序输入的结束呢?很多同学认为按下Enter键不就结束输入了么?这是错误的,因为我们已经说了输入有各种各样的形式,里面也不会帮你按下Enter键。所以,我们需要一个字符,一个任何文件都不会用到的字符----EOF(End Of File)。EOF定义在stdio.h文件中:

#define EOF (-1) 

为什么是-1?因为getchar()函数虽是int类型,但返回值通常都介于0~127,也就是ASCII码的范围,因此-1这个字符不会对应任意一个字符,所以它可以作为文件结尾的标志,用来结束文件的输入。在Windows系统中,用户可以通过Ctrl+Z来表示EOF,以结束文本流的输入。

解决问题

了解完以上内容,我们回到我们的代码:

int ch;
while((ch = getchar()) != EOF)	putchar(ch);

这里我们定义了一个整型变量ch,为什么不是字符型变量,因为字符型变量是无符号的,无法把-1这个值赋给字符型变量。

接下来进入我们的while循环,首先先输入一个字符,判断这个字符是否是EOF字符,若不是,则执行putchar(),此时用户输入的字符存储在缓冲区中,但没有按下Enter键,那么程序即使执行到putchar(),也不会将这个字符打印出来,因为压根就没有刷新缓冲区(笑),当用户按下Enter键之后,计算机刷新缓冲区,将这个缓冲区的内容打印出来

这里可能有的同学就问了:诶?putchar只能打印一个字符,那即使刷新了缓冲区,putchar()也只能打印一个字符啊
这句话确实没错,但是博主在这里需要强调一下,无论是printf还是putchar,其本质都是一样的,都是刷新缓冲区,将缓冲区的内容打印出来,而我们在普通的putchar的适合,是getchar,再putchar,而getchar的时候就已经输入Enter键,即刷新缓冲区,因此输出一个字符。这点各位同学一定要理解清楚啊。

如果解决了你的问题,请帮忙点个赞,谢谢大家哦~~
博主QQ:2240172425,可以加博主QQ一起交流学习经验
若是出现错误,还请大家海涵。

  • 87
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值