c语言while中的EOF


最近刷了一道题才想到了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(表达式),因为(表达式)没有成立而跳出了循环。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

萌神想

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

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

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

打赏作者

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

抵扣说明:

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

余额充值