关于清除数据缓冲区fflush()

fflush(stdout)和fflush(stdin)

fflush(stdin) : 即清理标准输入流,把多余的仍未被保存的数据丢掉。
fflush(stdout) : 清空输出缓冲区,并把缓冲区内容输出

fflush函数被广泛使用在多线程、网络编程的消息处理中。


解决scanf()输入函数缓冲区残留的问题。
大家都说用fflush(stdin)进行强制刷新,但是在Linux上的GCC不起什么作用。
文章转至:http://my.oschina.NET/deanzhao/blog/79790


 #include <stdio.h>
 int main()
{
    int i,c;
    for(;;)
    {
        printf("input :");

        #if 0
        if( feof(stdin) || ferror(stdin) )
        {   
            printf("error\n");
            break;
        }
        printf("up\n");
        while( (c = getchar()) != '\n' && c != EOF ) 
            ;
        #endif

        printf("down\n");
        //fflush(stdin);
        //fflush(stdout);
        printf("%d\n",i);
    }
    return 0;
}

程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,
程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户 输入。
但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,
那么程序会不停地输出“Please input an integer: 2”。
这是因为 scanf(“%d”, &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。
因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,
这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。
C和C++的标准里从来没有定义过 fflush(stdin)。
也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”
的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,
但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),
因为标准中根本没有定义 fflush(stdin)。

以上将被注释的代码用上,就能解决缓冲区残留的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值