有关C语言中的EOF

文章介绍了在C语言编程中遇到EOF(EndofFile)的概念,特别是在Windows系统下,EOF如何影响scanf函数和getchar()函数。通过示例代码,解释了当用户输入Ctrl+Z时,getchar()会立即结束,而scanf则会等待更多输入才会返回EOF,导致可能的死循环问题。解决此类问题需要程序员注意输入流的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.问题引出

 2.初识EOF

3.Windows系统中的EOF

4.回到题目 


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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值