zoukankan      html  css  js  c++  java
  • C语言清空输入缓冲区

    来源:http://blog.csdn.net/guanyasu/article/details/53153705

    https://zhidao.baidu.com/question/5241738.html

    C语言中如何清空输入输出缓冲区

     上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数,只是部分编译器自己实现的函数,是对标准C的扩展。

     先来看一段代码: 

     1 #include <stdio.h>  
     2 int main()  
     3 {  
     4     int num;  
     5     char ch ;  
     6     scanf("%d", &num);  
     7     scanf("%c", &ch);  
     8     printf("hello world
    ");  
     9     system("pause");  
    10     return 0;  
    11 }  

    设想输入一个数字和一个字母,应该出现如下情况

    1

    a

    hello world

    但事实是下面的样子

    1

    hello world

    -----------------------------

    原因是:在输入回车(‘ ’)时,相当于输入了一个字符,这样缓冲区内就残留了一个‘ ’。

    再有就是我们使用scanf("%c", &ch);在中断接受一个字符,但若用户输入好几个字符,那么ch将只接受一个,而这时大量字符滞留在缓冲区内,下次再调用scanf时,还没有输入东西,缓冲区内的内容直接传到了scanf内,这样就造成了严重的错误。

    下面是几种解决办法:

    ①解决办法一

     使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。

     1 #include <stdio.h>  
     2 int main()  
     3 {  
     4     int num;  
     5     char ch ;  
     6     scanf("%d", &num);  
     7     setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区  
     8     scanf("%c", &ch);  
     9     printf("hello world
    ");  
    10     system("pause");  
    11     return 0;  
    12 }  

    ②解决方法二

     1 #include <stdio.h>  
     2 int main()  
     3 {  
     4     int num;  
     5     char ch ;  
     6     scanf("%d", &num);  
     7     while ((c = getchar()) != EOF && c != '
    ');//不停地使用getchar()获取缓冲中字符,直到获取的c是“
    ”或文件结尾符EOF为止  
     8     scanf("%c", &ch);  
     9     printf("hello world
    ");  
    10     system("pause");  
    11     return 0;  
    12 }  

    使用getchar不断获取缓冲区内的内容,直到缓冲区内空为止,这种方法很有效,建议使用,C primer 上也介绍了这种方法。

    注意:有很多人可能觉得使用fflush(stdin);不就能清空缓冲区了,但使用这种方法有很多不确定性。

    网上查了原因:C和C++的标准里从来没有定义过 fflush(stdin)。
    某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,
    但是并非所有编译器都要支持这个功能(Linux 下的 gcc 就不支持),//亲测确实如此在linux的gcc下不能清空缓冲区
    因为标准中根本没有定义 fflush(stdin)。

    MSDN 文档里 也清楚地写着
    fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。
    当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。

    所以大家最好不要使用fflush,移植性不好,反正上面的方法也不烦。

      

  • 相关阅读:
    1、安装electron
    Bootstrap fileinput v3.0(ssm版)
    Bootstrap fileinput v2.0(ssm版)
    网络概念
    win10远程桌面连接提示身份验证错误,要求的函数不受支持的解决方案
    Quartz 定时任务时间设置
    牛顿迭代法快速寻找平方根
    mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败
    spring boot+mybatis+generator生成domain大小写问题
    Decoder is not a @Sharable handler, so can't be added or removed multiple times
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7268413.html
Copyright © 2011-2022 走看看