为什么输入非数字之后,会成死循环?
我写了一个小程序,想实现syetem("pause");这个函数的功能,用了一个循环,怎么输入非数字之后,会成死循环?
代码如下:
#include<stdio.h>
int main()
{
int i, j, k;
int e=3;
for(;;)
{
printf("i j k\n");
for (i=0; i<2; i++)
for(j=0; j<2; j++)
for(k=0; k<2; k++)
printf("%d,%d,%d\n", i, j, k);
printf("please enter the value of e:\n");
scanf("%d",&e);
if(e==0)
break;
}
return 0;
}
[解决办法]
在于if(e==0),你输入非数字,其实输入的是ASCII码,自然不满足条件,所以就会一直循环咯。
[解决办法]
%d要求int型,因为输入错误导致转换失败,输入流利的数据没有清空,所以第二次循环到scanf函数的时候不需要等待再次输入,他会重新扫描输入流利你输入的字母,所以再次转换失败,于是循环继续,所以变成了死循环。
[解决办法]
fflush(stdin);//在scanf前边加个 scanf("%d",&e);
[解决办法]
http://wenku.baidu.com/view/7c46430c6c85ec3a87c2c57c.html
建议也看看这个吧···
虽然有时fflush(stdin)可以解决问题···
不过跟平台也有关系···
#include<stdio.h>int main(){ int i, j, k; int e=3; for(;;) { printf("i j k\n"); for (i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++) printf("%d,%d,%d\n", i, j, k); printf("please enter the value of e:\n"); int count=scanf("%d",&e);//count用于测试是否正常读入内容 if(e==0||count!=0) break; } return 0;}
[解决办法]
scanf("%d",&e); 当程序发现你的输入与 "%d"不匹配时,他会将不合要求的字符退回,然后继续等待,直到有一个合适的或你终止 scan()功能
[解决办法]
这是由于“输入缓冲区有数据残留”导致的。比如输入字母:a,scanf("%d",&e);只接受整数类型,于是a被放回输入缓冲区,下次scanf函数执行时,由于输入缓冲区有数据,它会直接去缓冲区读取,但读取到的还是字母,于是又放回,如此反复。
所以解决办法就是在scanf之后清除输入缓冲区。
方法一: 如5楼,可以用fflush(stdin);,不过这可能不属于c标准做法,而是vc编译器的扩展,所以可能对其它编译器不灵。
#include<stdio.h>int main(){ int i, j, k; int e = 3; for(;;) { printf("i j k\n"); for (i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++) printf("%d,%d,%d\n", i, j, k); printf("please enter the value of e:\n"); scanf("%d",&e); if(e==0) break; fflush(stdin); } return 0;}
------解决方案--------------------
请检查scanf的返回值。
[解决办法]
rewind(stdin);
or
stdin-_cnt=0;