C语言中scanf( )函数的数据检查问题
问题描述
在C语言利用scanf( )函数进行输入时,如果输入数据的格式不符合格式控制符,scanf( )函数不会读取该值。该值会一直存在在缓冲区中,导致下次scanf时仍然会读取这个值。如下面的程序段所示,本意为输入学生的年龄,必须填写int型,如果填成字符串,会出现提示,让重新输入。
printf("input age:")
status = scanf("%d",&age);
while(status == 0)
{
printf("invalid input,type aged gain:");
status = scanf("%d",&age);
}
但在实际运行中会发现,如果输入的不是一个整数,而是一个字母,系统会不间断输出"invalid input,type aged gain:",这是因为输入的字母会一直处于输入缓冲区,直到被正确的scanf()函数读取。
解决方法1----fflush(stdin)
fflush(stdin);能够清除缓冲区数据,但是并非所有的编译器都有这个库函数。
fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。
printf("age:");
status = scanf("%u",&age);
while(status == 0)
{
fflush(stdin);//清除缓冲区未被读取的错误数据
printf("invalid input,type aged gain:");
status = scanf("%u",&age);
}
解决方法2----利用scanf("%*s")
C Primer Plus 5th 一书中在进行了数据格式检查后,对不符合格式输入要求的数据,采用scanf("%*s")进行处理。这条语句是读取字符串,键盘上输入的字符大多符合这个要求,而s前面的星号则表示跳过后面的数据不进行读取。缓冲区的数据会被清空。
printf("age:");
status = scanf("%u",&age);
while(status == 0)
{
scanf("%*s");
printf("invalid input,type aged gain:");
status = scanf("%u",&age);
}
一个完整的程序–请读者指正
/*C语言中scanf()函数输入时的数据检查方式*/
/*C语言中scanf()函数输入时的数据检查方式*/
#include <stdio.h>
unsigned int age;
char name[128];
float score;
void input(void);
int main(void)
{
printf("Hello world!\n");
input();
if (score >= 60)
printf("That is great!\n");
else
printf("you have to learn it again....");
return 0;
}
void input()
{
int status;
printf("name:");
status = scanf("%s",name);
while(status == 0)
{
scanf("%*s");
//fflush(stdin);
printf("invalid input,type name again:");
status = scanf("%s",name);
}
printf("age:");
status = scanf("%u",&age);
while(status == 0)
{
scanf("%*s");
//fflush(stdin);
printf("invalid input,type aged gain:");
status = scanf("%u",&age);
}
printf("score:");
status = scanf("%f",&score);
while(status == 0)
{
scanf("%*s");
//fflush(stdin);
printf("invalid input,type score again:");
status = scanf("%f",&score);
}
printf("**************\n");
printf("name:%s;\nage:%d;\nscore:%.2f\n",name,age,score);
}