在scanf("%d",&m)函数中输入字符的后果
下面是我写的判断输入的数是否为素数的一个小程序,如果正常输入整型数据没有问题,但如果误输入字符后就有问题了,输入的数据没法传到m变量中,并且在下一个循环不会
等待数据的输入,就直接往下执行了,谁能帮分析一下原因吗?
#include <stdio.h>
#include <math.h>
void main()
{
int m, i, k;
char ch = '\0';
while(1)
{
printf("Input a number: ");
scanf("%d", &m);//等待数据输入
k = sqrt(m);
for( i = 2; i <= k; i++ )
{
if( 0 == m % i)
{
break;
}
}
if( i > k )
{
printf("您输入的是一个素数\n");
}
else
{
printf("您输入的不是一个素数\n");
}
printf("Exit: Esc\tContinue: Enter\n"); //继续按Enter,退出按Esc
for( ch = getch() ;27 != ch && 13 != ch; ch = getch() ) //判断按下的是Esc还是Enter,
{ //都不是,继续等待按键按下,直到是为止
continue;
}
if( 27 == ch )
{
break; //按下Esc退出
}
}
} scanf如果没有接收到所需要的数据类型的数据时,并不会清空缓存,以上代码在运行后,如果输入一个字符串时,由于scanf需要一个整型数据,可是当前输入缓冲中的数据并不是一个整型的数据,那么scanf会直接退出,并返回0,表示读到0个数,同时不会改为输入缓冲,这样在打印出"error,input again:"后,会进入到下一轮的循环之中,这时由于输入缓冲中还有数据,scanf不会阻塞,而是直接返回,可是发现缓冲中的数据不是所要的数据,这样返回0.....使得循环一直运行下去,而不可能因为用户的再次输入退出循环。
可把代码做如下改变 while((k = scanf("%d",&m))!=1)
{
printf("error,input again:");
while((ch=getchar())!='\n');
k = sqrt(m);
}这样当用户输入的数据类型非法时,内层的while循环就会不停的读输入缓冲,直到读完或收到一个回车换行为止,这样就达到清空输入缓冲的目的了,这种方法具有跨平台的特性。 福禄娃娃 发表于 2013-10-8 01:24 static/image/common/back.gif
scanf如果没有接收到所需要的数据类型的数据时,并不会清空缓存,以上代码在运行后,如果输入一个字符串时, ...
非常感谢,大致了解了,那用什么方法可以查看当前缓冲区的数据呢
页:
[1]