持续输入小妙招--~scanf(),scanf()不等于EOF,scanf()==某个值

本文深入探讨了C语言中使用`while(~scanf())`、`while(scanf()!=EOF)`和`while(scanf()==某个值)`构造循环时的原理。讲解了scanf返回值的含义,特别是如何利用这些返回值来判断文件结束和输入匹配情况。同时,分析了当输入不匹配时导致的死循环原因,揭示了缓冲区在其中的作用。通过实例代码,帮助读者理解避免死循环的方法。
摘要由CSDN通过智能技术生成

目录

while(~scanf())

while(scanf()!=EOF)

while(scanf()==某个值)

当~scanf(),scanf()!=EOF,输入不匹配值时候,陷入死循环的原因


当我们想要持续输入某些数值并且得到结果的时候,我们就可以使用这三种方式~scanf()

while(~scanf())

#include<stdio.h>
int main()
{
	int a = 0;
	int b = scanf("%d", &a);
	printf("%d", b);
	return 0;
}

 ~的意思是按补码(二进制)位取反
scanf的返回值是输入元素的个数,如果读取到文件结束的时候,就会返回-1
-1的补码为全1,按位取反后就是全0,也就是0
当while内为0时,为假,跳出循环

while(scanf()!=EOF)

#include<stdio.h>
int main()
{
	int a = 0;
	while (scanf("%d", &a) != EOF)
	{
		printf("%d", a);
	}
	return 0;
}

EOF在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)
EOF的值相当于-1
,因为,正常情况下scanf的返回值都是非负数,所以我们可以用EOF来作为文件结束标志
当读取完毕时候,返回值为-1,-1==EOF,导致循环条件为假,从而跳出循环

while(scanf()==某个值)

#include<stdio.h>
int main()
{
	int a = 0;
	while (scanf("%d", &a) == 1)
	{
		printf("%d", a);
	}
	return 0;
}

scanf接收到多少个数的时候,返回值就是多少
当我们想要循环输入一个数的时候,使得它等于1,这样的话,每次输入一个数,它的返回值就等于1,为真,从而实现持续输入多行数的操作

当~scanf(),scanf()!=EOF,输入不匹配值时候,陷入死循环的原因

#include<stdio.h>
int main()
{
	int a = 0;
	while (~scanf("%d", &a))
	{
		printf("%d\n", a);
	}
	return 0;
}

或者

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

当我们输入a的时候,我们发现出现了这样的情况
直接进入死循环,重复输出0,每次经过循环的时候也没有重新让我们输入
这是什么原因呢?

这是由于我们在输入和输出的中间有一个缓冲区

当我们输入a的时候,这个a就进入了缓冲区,因为scanf读取的是%d,所以读取不到a返回了0,但是由于这个a一直在缓冲区scanf需要将缓冲区内的数据读取完才能继续进行输入,但是读取不到,所以陷入了死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一起慢慢变强

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

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

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

打赏作者

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

抵扣说明:

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

余额充值