目录
EOF是什么?
EOF搭配while的实际应用场景1
EOF搭配while的实际应用场景2
补充
后言
EOF是什么?
EOF, 在C语言的标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。
在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127(ASCII的取值范围应该为0~255,0~127保留的是英文、数字和标准符号,128~255是后面进行拓展的ASCII),不可能出现-1,但正好EOF是定义在头文件<stdio.h>的常量,EOF的本质是-1(ASCLL)。因此可以用EOF作为文件结束标志。
还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
EOF搭配while的实际应用场景1
#include <stdio.h>
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
}
return 0;
}
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去。
但如果加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束。
(while的意思就是说当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)
如何结束程序呢?
在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”。
因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while。
以下题为例:
·从上代码可见,在VS2019的情况下,需要三次<Ctrl + z>组合键
·上面我们说了EOF的本质是-1,这里又有小伙伴迷惑了,那scanf怎么能和-1相比较呢?
其实scanf函数返回值是实际读到数据的个数。例如我们输入4,那我们的scanf函数读到的数据个数就是1,1不等于-1,进入while循环。
参考scanf函数详解
我们不论在scanf函数中输入什么,要让读到数据的个数永远都不可能等于-1(即让scanf读取正常),这样循环就不停止,就可以多组输入。所以下面写法也是正确的。
while(scanf("%d",%i) == 1)
如果输入正常,则scan返回值为输入数据的个数(>=1的值),所以while循环条件为真,执行循环。
直到scanf输入为假(Ctrl+Z或者输入类型不匹配的数据类型),则返回值为-1或者0。因为scanf返回值不等于1,所以while循环条件为假,不再执行循环。
EOF搭配while的实际应用场景2
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int ch;
while ((ch = getchar()) != EOF) putchar(ch);
}
从上面代码和运行结果可以看出,EOF搭配while可以控制 字符串输入个数。
当然用法不止这些,需要自己去探索
补充
当系统在检测缓冲区中是否含有流结束标志时,有两种检测方式:阻塞式和非阻塞式
1.阻塞式:指的是只有在回车键按下之后,才会对缓冲区中是否含有ctrl+z组合键进行检查。需要注意的是,当缓冲区中含有可读数据时,ctrl+z就不是结束标志。我们需要明白,ctrl+z产生的并不是一个普通的ASCⅡ码值,也就是说它不会跟其他从键盘上输入的字符一样,它是不能够存放在输入缓冲区中的。
2.非阻塞时:指的是一旦按下ctrl+d之后立即响应。
如果之前没有输入字符,那么ctrl+d就是流结束标志。
如果之前已经输入了字符,那么ctrl+d此时就相当于回车不再是流结束标志,并且具有回车的功能(将输入字符送入缓冲区),并且这个回车自己也会进入缓冲区!!!
当然了windows系统一般采用阻塞式检查(ctrl+z),linux系统一般采用非阻塞式检查(ctrl+d)
文章来源:https://www.toymoban.com/news/detail-496317.html
后言
本篇作为本人刚开始学习以来第一篇技术性博客,可能存在没解释通、漏解释、或者解释错误的地方。希望各位可以在评论区指出我的问题,如果可以得到您的解决方案,我将不胜感激。文章来源地址https://www.toymoban.com/news/detail-496317.html
到了这里,关于【C语言】EOF搭配while循环来控制scanf输入的次数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!