【C语言】C语言中EOF的具体用法

前言

在C语言中存在关键字EOF
EOF是一个整数类型的宏定义,扩展为负数常量表达式(通常为-1)。它被头文件中的好几个函数作为返回值使用,来表明已经到达文件尾或者示意一些其他的错误条件。它也被作为一个值来表示无效的字符。

这样的概念比较难理解,我们用代码的形式解释

我在VS2022编译器下创建了test.c文件,写一段简单代码,选中EOF右键点击转到定义
在这里插入图片描述
点击转到定义后发现关键字EOF的定义被保存在头文件stdio.h中
且被定义为-1;
在这里插入图片描述

那么EOF具体在程序中有什么作用呢?

其实在很多在线oj上,有很多题目没有给定输入的数据的数目
例如牛客网这道题目
在这里插入图片描述

题目链接:https://www.nowcoder.com/practice/8312e497509a450f968d9a6a2381ce32?tpId=107&&tqId=33323&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking

我们可以看到在这道题目的输入描述中出现多组输入但是并没有告诉我们具体数量,在这个时候就需要用到EOF;

scanf返回值的了解

在知道如何用EOF解决上述问题时,我么要先知道C语言中的关键字scanf
scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。
在这里插入图片描述
在MSDN上对scanf的返回值做出了解释
scanf函数是有返回值的。
一般来说,它的返回值是成功读取的元素个数。但当遭遇读取失败时,它的返回值便是 -1 (也就是它自己返回一个EOF) 。
而若是一个元素都还没成功读入的时候就遇到了读取失败或EOF,那它直接就会返回-1,不管后面再输入了什么。

例如:

#include<stdio.h>
int main()
{
	int b = 0, c = 0;
	int a = scanf("%d", &b);//这里scanf格式化输入的数据个数是1
	printf("%d", a);
	return 0;
}

在这里插入图片描述
我们可以看到将scanf的返回值给到a后,a的值是1

#include<stdio.h>
int main()
{
	int b = 0, c = 0;
	int a = scanf("%d%d", &b,&c);//这里scanf格式化输入的数据个数是2
	printf("%d", a);
	return 0;
}

我们可以看到将scanf的返回值给到a后,a的值是2

如果b被成功赋值,而c没有,则返回1
在这里插入图片描述

如果b没有成功赋值,c成功赋值,则返回EOF,且给c所赋的值也不会传入c
(我使用的编译器在这里有些小bug,必须输入三次ctrl+z)
在这里插入图片描述
这就是scanf返回值的基本情况

EOF使用

我们可以写出以下代码
此代码可以实现一直输入

#include<stdio.h>
int main()
{
	int a = 0;
	while (scanf("%d", &a) != EOF)//循环输入a
	{
		printf("%d\n", a);//打印a
	}
	return 0;
}

因为scanf只读取一个数据,所以返回值是1,所以无论输入多少,循环都会一直进行下去,类似“死循环”。
效果如下:
在这里插入图片描述

到这里EOF相关的用法已经解释完毕

希望我的博客能对你的学习有所帮助,如果有错误欢迎积极指出。

所用编译器 VS2022

  • 64
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉着的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值