【C语言】C语言中EOF的详细用法

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

前言
  在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,不管后面再输入了什么。

例如:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int b = 0, c = 0;
  5.         int a = scanf("%d", &b);//这里scanf格式化输入的数据个数是1
  6.         printf("%d", a);
  7.         return 0;
  8. }
复制代码

我们可以看到将scanf的返回值给到a后,a的值是1
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int b = 0, c = 0;
  5.         int a = scanf("%d%d", &b,&c);//这里scanf格式化输入的数据个数是2
  6.         printf("%d", a);
  7.         return 0;
  8. }
复制代码
我们可以看到将scanf的返回值给到a后,a的值是2
如果b被成功赋值,而c没有,则返回1

如果b没有成功赋值,c成功赋值,则返回EOF,且给c所赋的值也不会传入c
(我利用的编译器在这里有些小bug,必须输入三次ctrl+z)

这就是scanf返回值的基本情况
EOF利用

我们可以写出以下代码
此代码可以实现不绝输入
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a = 0;
  5.         while (scanf("%d", &a) != EOF)//循环输入a
  6.         {
  7.                 printf("%d\n", a);//打印a
  8.         }
  9.         return 0;
  10. }
复制代码
由于scanf只读取一个数据,所以返回值是1,所以无论输入多少,循环都会不绝进行下去,雷同“死循环”。
效果如下:

   到这里EOF相关的用法已经解释完毕
  盼望我的博客能对你的学习有所帮助,如果有错误欢迎积极指出。
所用编译器 VS2022

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表