如下代码:
#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()不加参数就是清空输入流缓冲区,可是这样也有一个问题。
方法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; }