如下代码:
#include<iostream>
using namespace std;
int main()
{
int m;
while(1==scanf("%d",&m))
{
puts("OK");
}
system("pause");
}
这种代码可以正确的循环,即输入整数就输出ok,然后等待继续输入下一个输入。说明:scanf("%d",&m) 如果early match成功,返回成功读入的变量数目,这里只有一个变量m,所以总是返回1。
但是如下代码:
while(scanf("%d",&m)!=1)
仅仅是把==换成!=,我想象的情况是如果输入不是整数,则输出ok,然后等待下一个输入,可实际情况是一直在输出OK,永远不停。
原因:
scanf()是读的缓冲区,你输入的不是数字,读取就失败,缓冲区就不会空。所以它会一直读。
方法1:
用fflush就可解决。
更改如下:
while(scanf("%d",&m)!=1){
puts("OK");
fflush(stdin);
}
方法2:
好像gcc并不支持fflush,我在linux下用gcc试过了,还是不能退出循环,不过也没报错。
while(scanf("%d",&m)!=1)
{
puts("OK");
getchar();
}
原来getchar()不加参数就是清空输入流缓冲区,可是这样也有一个问题。
如果我输入连续多个非整数,这个循环就会输出多个ok。比如我输入abcde,那么缓冲区就有这5个字符,getchar()一次清一个,循环就会5次。有没有什么办法不管输入多少字符,都一个一次清空缓冲区?
方法3:
while(scanf("%d",&m)!=1){
puts("OK");
char c;
while((c=getchar())!= '\n' && c != EOF );
}
完美解决。
方法4。1:setbuf(stdin, NULL)
while(scanf("%d",&m)!=1)
{
puts("OK");
setbuf(stdin,NULL);
}
这也是个好办法,不过也有问题,第一次输入abcde可以一次关闭缓冲区,输出ok,但是第二次循环你再输入abcde,就会有5个连续的OK。
方法4.2:setbuf
(stdin,inbuf)
int main(void)
{
int m;
char inbuf[50];
while(scanf("%d",&m)!=1)
{
puts("OK");
setbuf(stdin,inbuf);
}
return 0;
}
也能解决。