C语言:scanf的使用

目录

一、scanf的循环读取

1、scanf的一次读取

2、加入while循环使scanf能进行循环读取

3、由于scanf出错时会返回EOF,故代码改为

4、加入rewind清空缓冲区(只适用于vs)

​5、练习:输入小写字母,输出大写字母 

二、scanf的混合输入


在VS2019集成环境下

一、scanf的循环读取

1、scanf的一次读取

#define _CRT_SECURE_NO_WARNINGS//解决scanf报错问题

#include <stdio.h>

int main()
{
	int i;
	scanf("%d", &i);
	printf("i=%d", i);
	return 0;
}

缺点:只能输入一次,不方便多次输入调试

2、加入while循环使scanf能进行循环读取

#define _CRT_SECURE_NO_WARNINGS//解决scanf报错问题

#include <stdio.h>

int main()
{
	int i;
	while (scanf("%d", &i))
	{
		printf("i=%d\n", i);
	}
	return 0;
}

缺点:无法结束调试,如图

3、由于scanf出错时会返回EOF,故代码改为

#define _CRT_SECURE_NO_WARNINGS//解决scanf报错问题

#include <stdio.h>

int main()
{
	int i;
	while (scanf("%d", &i)!=EOF)
	{
		printf("i=%d\n", i);
	}
	return 0;
}

vs2019中使scanf出错即连续输入3次ctrl+z+enter,如图

缺点:如果输入不规范,如代码中要求输入的是整型,但手误输入char型就会出现无限打印上一次输入的结果,如图

原因:假设先输入的5(此时缓冲区的内容是“5\n”),输出5后(此时缓冲区里的内容是“\n”),输入d(由于scanf会自动清除\n,此时缓冲区的内容是“d\n”),但由于d不符合要求输入的整型类型,scanf也不会清除“a\n”,同时又不等于EOF,故运行while里面的代码,由于i仍然等于5,故输出5,无限次循环以上内容,故出现不断输出5的结果

4、加入rewind清空缓冲区(只适用于vs)

#define _CRT_SECURE_NO_WARNINGS//解决scanf报错问题

#include <stdio.h>

int main()
{
	int i;
	while (rewind(stdin),scanf("%d", &i)!=EOF)
	{
		printf("i=%d\n", i);
	}
	return 0;
}

 这样做的结果如图


5、练习:输入小写字母,输出大写字母 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	char c;
	while (scanf("%c", &c) != EOF)
	{
		if (c != '\n')
		{
			printf("%c", c - 32);
		}
		else
		{
			printf("\n");
		}
	}
	return 0;
}

结果如图

这种时候不需要加入rewind,如果加入

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	char c;
	while (rewind(stdin),scanf("%c", &c) != EOF)
	{
		if (c != '\n')
		{
			printf("%c", c - 32);
		}
		else
		{
			printf("\n");
		}
	}
	return 0;
}

 就会发生下面的现象

原因:当scanf读取一个字符后,rewind会将缓冲区里的内容清空(即“ello\n”) 

二、scanf的混合输入

如果代码写出这样

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	int i;
	char c;
	float f;
	scanf("%d%c%f", &i, &c, &f);
	printf("i=%d,c=%c,f=%f\n", i, c, f);
	return 0;
}

结果会出现

i读取成功,c读取了空格,f没读取成功。

解决办法: 混合输入时每次在c%之前加入空格

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	int i;
	char c;
	float f;
	scanf("%d %c %f", &i, &c, &f);
	printf("i=%d,c=%c,f=%f\n", i, c, f);
	return 0;
}

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值