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 

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

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

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

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

#include 

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

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

C语言:scanf的使用_第1张图片

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

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

#include 

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

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

C语言:scanf的使用_第2张图片

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

C语言:scanf的使用_第3张图片

原因:假设先输入的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 

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

 这样做的结果如图

C语言:scanf的使用_第4张图片
5、练习:输入小写字母,输出大写字母 

#define _CRT_SECURE_NO_WARNINGS

#include 

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

结果如图

C语言:scanf的使用_第5张图片

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

#define _CRT_SECURE_NO_WARNINGS

#include 

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

 就会发生下面的现象

C语言:scanf的使用_第6张图片

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

二、scanf的混合输入

如果代码写出这样

#define _CRT_SECURE_NO_WARNINGS

#include 

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;
}

结果会出现

C语言:scanf的使用_第7张图片

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

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

#define _CRT_SECURE_NO_WARNINGS

#include 

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;
}

C语言:scanf的使用_第8张图片

你可能感兴趣的:(C语言,c语言,c++,开发语言)