由于函数scanf( )不做参数类型匹配检查,因此,当输入数据类型与格式字符不相符时,编译器并不提示错误信息,然而不能正确读入数据。
怎么解决这个问题呢?我们可以考虑检验函数scanf( )调用返回值的方法。如果函数scanf( )调用成功(能正确读入输入数据),则返回值为已成功读入的数据项数。当用户输入不相符的数据类型时,我们可以在程序中,给出错误的提示,采用函数fflush( )来清除缓冲区中的内容,然后提示用户重新输入数据直到输入正确为止。
由于ANSI C只规定函数fflush( )处理输出数据流、确保输出缓冲区中的内容写入文件,并未对清理输入缓冲区作出任何规定,只是部分编译器(如Visual C++和Turbo C等)增加了此项功能,因此使用函数fflush( )来清除输入缓冲区中的内容,可能会带来移植问题。
下面的程序用于解决上面问题:
#include
void main()
{
int a,b,ret;
do
{
printf("Input a and b:\n");
ret=scanf("%d%d",&a,&b);
if (ret!=2)//输入错误,如输入格式错误,存在非法字符等
{
printf("Input error!\n");
fflush(stdin);//清除缓冲区中的错误信息
}
}while(ret!=2);
printf("a=%d, b=%d\n",a,b);
}
程序运行结果为: