当前位置:网站首页 > 技术博客 > 正文

while(!feof(fp))什么意思



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

 

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

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

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

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

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

 

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

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

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

 

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

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

 

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

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

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

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

  • 上一篇: 从此处起航作文
  • 下一篇: event but
  • 版权声明


    相关文章:

  • 从此处起航作文2024-12-07 08:01:03
  • gbdt+lr2024-12-07 08:01:03
  • .zip文件解压命令2024-12-07 08:01:03
  • 构造器this2024-12-07 08:01:03
  • mysql分区分表原理2024-12-07 08:01:03
  • event but2024-12-07 08:01:03
  • 012背包问题2024-12-07 08:01:03
  • js原型原型链有什么特点2024-12-07 08:01:03
  • ipcrm命令2024-12-07 08:01:03
  • dns域名解析ip2024-12-07 08:01:03