scanf、fflush、getchar随手记录

如下代码:

#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;
}

也能解决。



你可能感兴趣的:(scanf、fflush、getchar随手记录)