scanf函数和getchar输入型函数注意事项,容易导致死循环

时间:2021-12-16 01:52:45

先看一段正确的代码

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<stdlib.h>

int main()
{
int num = 0;
printf("请输入一个不多于5位数字的数:>");
scanf("%d", &num);
while(num > 99999 || num<0)
{
printf("\n输入错误!请重新输入:>"); //
scanf("%d", &num); //
}
if (num / 10 == 0)
{
printf("\n一位数字\n");
}
if ((num/10)>0 && (num/10)<=9)
{
printf("\n2位数字\n");
}
if ((num / 100) > 0 && (num / 100) <= 9)
{
printf("\n3位数字\n");
}
if ((num / 1000) > 0 && (num / 1000) <= 9)
{
printf("\n4位数字\n");
}
if ((num / 10000) > 0 && (num / 10000) <= 9)
{
printf("\n5位数字\n");
}
system("pause");
return 0;
}

注:下边一段代码会发生死循环

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int main(){	int num = 0;	printf("请输入一个不多于5位数字的数:>");	scanf("num = %d", &num);	while(num > 99999 || num<0)	{		printf("\n输入错误!请重新输入:>");		scanf("num = %d", &num);    	}	if (num / 10 == 0)	{		printf("\n一位数字\n");	}	if ((num/10)>0 && (num/10)<=9)	{		printf("\n2位数字\n");	}	if ((num / 100) > 0 && (num / 100) <= 9)	{		printf("\n3位数字\n");	}	if ((num / 1000) > 0 && (num / 1000) <= 9)	{		printf("\n4位数字\n");	}	if ((num / 10000) > 0 && (num / 10000) <= 9)	{		printf("\n5位数字\n");	}	system("pause");	return 0;}

注:scanf双引号之间一般只写%s等一些。如果在双引号之间有个空格,运行就会错误。

应为输入一个错误数字与回车键,scanf是输入型函数,他会向缓冲区拿数据,第一个scanf把错误数据拿走,剩下\0被第二个scanf拿走。所以会成为死循环。所以我们需要清理缓冲区:?

(1)在第二个scanf前面加一个getchar(),把空格给他,可是如果空格比较多的话就不合适了

(2)在第二个scanf前面加一个fflush(stdin)//清理缓冲区

可是在vs2015版本之后就不能用了;

(3)加一个循环//常用方法

在第二个scanf之前加下列代码

while (getchar() != '\n')		{			;		}

最后效果代码

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int main(){	int num = 0;	printf("请输入一个不多于5位数字的数:>");	scanf("num = %d", &num);	while(num > 99999 || num<0)	{		printf("\n输入错误!请重新输入:>");		while (getchar() != '\n')		{			;		}		//fflush(stdin);   //刷新输入缓冲区		//getchar();		scanf("num = %d", &num);    	}	if (num / 10 == 0)	{		printf("\n一位数字\n");	}	if ((num/10)>0 && (num/10)<=9)	{		printf("\n2位数字\n");	}	if ((num / 100) > 0 && (num / 100) <= 9)	{		printf("\n3位数字\n");	}	if ((num / 1000) > 0 && (num / 1000) <= 9)	{		printf("\n4位数字\n");	}	if ((num / 10000) > 0 && (num / 10000) <= 9)	{		printf("\n5位数字\n");	}	system("pause");	return 0;}
如有错误,希望广大网友留言,谢谢;