目录
1.问题引出
今天在做题的时候遇到这样一题:
这是一到很容易的题就是判断数字的奇偶性, 这是我一开始的思路:
int main() {
int a = 0;
int b = 0;
scanf("%d", &a);
scanf("%d", &b);
if (a % 2 == 0) {
printf("Even\n");
}
else
printf("Odd\n");
if (b % 2 == 0) {
printf("Even\n");
}
else
printf("Odd\n");
return 0;
}
But unfortunately,提交出现错误,遇到了如下的问题:
因此这对编程小白的我来说遇到了问题,我陷入了沉思,不知道怎么做了,所以我看了答案哈哈哈,看到了如下代码:
#include <stdio.h>
int main() {
int a = 0;
while (scanf("%d", &a) != EOF) {
if (a % 2 == 0)
printf("Even\n");
else
printf("Odd\n");
}
return 0;
}
2.初识EOF
To be honestly,这是我第一次见到EOF,因此我查阅了资料,了解到他的全称是(END OF FILE),即文件的结束,当程序读取文件时,如果读到了EOF,则说明已经读取到了文件的结尾,接下来我将用我自己的理解叙述一下EOF:
在C语言中,程序可以通过检查scanf或者是getchar()等输入函数的 返 回 值 来判断是否读取到了EOF。如果用户输入了control+z,输入函数会将其视为文件结束的标志。
EOF在C语言中启用的是宏定义:
3.Windows系统中的EOF
在Windows系统中,如果是getchar()函数,用户在控制台输入了control+z,则程序就会停止,例如以下这段代码:
#include <stdio.h>
int main()
{
int a = 0;
a = getchar();
while (a != EOF) {
putchar(a);
a = getchar();
}
return 0;
}
当输入control+z时:
这时getchar()读到了control+z,则结束运行。
但是如果是scanf函数则会不同
例如以下这段代码:
int main()
{
int c = 0;
int d = 0;
while (d = scanf("%d",&c) != EOF) {
printf("加勒比之杰克\n");
}
return 0;
}
看一下他的运行结果:
很显然,当我输入control+z的时候系统并没有运行结束,而是在等我继续输入,因此,在Windows系统中,当输入流结束时,scanf函数并不会立即返回EOF,而是会等待用户再次输入数据,直到用户再次输入Ctrl+Z才会返回EOF并结束输入。(在Visual Studio2022中要连续输入三次control+z才会结束),例如:
4.回到题目
那我们回到本题就很好理解了,but,还有一点需要注意:就是当我们输入(任意一个数字)+(control+z)的时候,在Windows系统中会进入死循环,例如,当我输入1+control z的时候,会出现以下情况:
此时我们需要按下control+c强制停止。
然而出现以上情况的原因是什么呢?我们来尝试理解一下:
在Windows系统中,当用户在控制台中输入1,然后按下Ctrl+Z,程序会将1作为输入读入,但不会立即返回EOF,而是等待用户输入更多的数据。由于while循环中的条件判断使用了scanf函数的返回值,而scanf函数并不会返回EOF,因此循环会一直执行,直到用户在控制台中按下Ctrl+C或关闭控制台窗口为止。
在这种情况下,程序会一直执行循环体中的代码,即判断输入的数字是偶数or奇数,并输出"Even"或"Odd"。由于输入流已经结束,而程序并不会退出循环,因此会一直输出"Odd",形成死循环。
OK,以上是我关于Windows系统中EOF的理解,希望对小伙伴们有帮助,也欢迎大家借鉴我的gitee网站:加勒比之杰克 (Jason-of-carriben) - Gitee.com