最近刷了一道题才想到了EOF。
题目:每输入两个整数,交换他们的值。
我不假思索写了一段代码。
#include<stdio.h> int main() { int a, b, temp; while (scanf("%d %d", &a, &b) != EOF) { printf(" 交换前:a = %d ,b = %d\n", a, b); temp = a; a = b; b = temp; printf(" 交换后:a = %d ,b = %d\n", a, b); } return 0; }
答案也很满意
只不过,我感觉还是有点不满足,看着下面这行代码沉思了很久......对它下手了
while(scanf("%d %d",&a,&b) != EOF)
虽然知道这段代码的功能(“不受限制”地输入数据,进入循环),但我对EOF还是存在一些疑惑。
我决定一探究竟,在搜索很多与这行代码相关的信息后,令我满意的答案仍未出现。
然后开始我的思路:提出疑惑,条件分析,总结答案。
疑惑:只要while(scanf("%d %d",&a,&b) != EOF)中scanf()内容输入不出错,while就是死循环,那么怎么让scanf()内容输入出错呢?换句话说,我想找到跳出这个循环的方法。
接下来,开始我的分析
首先,咱们都知道while是一个语句循环,基本用法如下:
while (表达式) { 语句; }
很明显,只要while中(表达式)成立,那么我就可以进入{花括号}里面继续操作...
ok,解决疑惑的范围缩小,锁定在(表达式)这里。(好像是屁话,哈哈哈哈)
再结合我的疑惑,while(括号)里写的是(scanf("%d %d",&a,&b) != EOF)。
嗯.....我有一点想法,但是不敢说,只好大胆一下:或许在我的印象中scanf()除了可以帮我取得键盘输入值外,它还有其它功能!?
等等,或许我漏掉了一个关键信息,scanf()居然可以进行关系运算(如上面的,!=),难道scanf()可以返回一个确定的值吗?
明白了,搜索一下,我就知道。
int scanf(const char * restrict format,...);
scanf()函数返回值分为3种:
(1)返回正整数。表示正确输入参数的个数。
(2)返回整数0。表示用户的输入不匹配,无法正确输入任何值。
(3)返回-1。表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复多次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
简单来说,就是scanf()可以返回一个整型的值。
ok,有点猪脑过载,不过没关系。(没事,这是屁话,哈哈哈哈)
现在我可以认定scanf()是返回一个值(目前不知道是多少哈),待解决的疑惑范围再次缩小。
EOF这个家伙一定也可以是整数,于是又搜索一下,我就知道。
EOF四条相关信息:
1、EOF,为EndOfFile的缩写,通常在文本的最后存在此字符表示资料结束。
2、在C语言中,EOF常被作为文件末尾的标志。实际上EOF的值通常为-1。
3、在微软的DOS和Windows中,读取数据时终端不会产生EOF。系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF。
好的,分析完毕,在黑框(终端)中<Ctrl+z>组合键+Enter键可以实现EOF被认定为-1。
思考到这里,我或许发现了理想的答案。
- 我们知道scanf()可以返回一个整型值
- 现在<Ctrl+z>+Enter告诉scanf()说到文件末尾啦(也即scanf()取-1)
- 恰好EOF等于-1
- 于是scanf("%d %d",&a,&b) != EOF为否
- 最后while(表达式),因为(表达式)没有成立而跳出了循环。