c语言缓冲问题

来源:互联网 发布:大数据数据库有哪些 编辑:程序博客网 时间:2024/05/17 17:38

         最近做acm时候,老是在输入输出的问题上卡时间,真是很蛋疼啊,故总结了下,关于清空的问题。


清空键盘缓冲区的一种好方法!
用  rewind(stdin);  语句可以达到很好的清空键盘缓冲区的作用。不用考虑太多其他因素。这是我在一本名为《软件开发:编程与设计(C语言版)》中所了解到的,作者是USA的David Conger。
    以前也了解到其他的清空键盘缓冲区的方法,如:用getchar();fflush(stdin);等。但感觉很麻烦,不好用,也不容易理解。而rewind(stdin)简单好用,而且是一种可移植的方法。

举个例子:

#include <stdio.h>

int main()
{
    int i;
    char aString[3];

    printf("Please enter some characters:");   /*先向键盘缓冲区里输入无用字符*/

    getchar();

    rewind(stdin);                             /*清空键盘缓冲区里的无用字符*/

    printf("Please enter 'OK': ");             /*输入字符串“OK”*/
    
    for(i=0;i<2;i++)                           /*字符串aString接受字符串“OK”*/
    {
        aString[i]=getchar();
    }
    aString[i]='\0';

    puts(aString);                             /*输出字符串aString*/

    return(0);
}

Microsof Visual C++下调试结果:

输入:abcdefghijk回车OK回车
输出:OK

之前缓冲区里的abcdefghijk垃圾字符都被清空了。

下面向新手解释一下rewind(stdin);的工作原理。

C语言把键盘,显示器等设备当做文件来处理,也就是说从键盘输入相当于从一个文件中读入,向显示器输出相当于向一个文件写出。
而stdin是C标准库定义的标准文件之一,它与键盘相关联。我一般把它理解为指向键盘这个“文件”的指针。
而rewind()函数的作用是把文件的当前位置指针指向文件头。
两者结合,rewind(stdin);的作用也就是把“指向键盘(一个文件)的指针从当前位置挪到键盘(一个文件)开头”,相当于抛弃了当前键盘缓冲区中的数据,重新开始输入。
虽然并不是真正的把缓冲区里的数据全部清掉,但却起到了清空键盘缓冲区的作用。

原创粉丝点击