C语言:如何清空缓冲区?

C语言:如何清空缓冲区?
以下代码如何解释

while ((temp = getchar()) != '\n')//用于清空缓存区
    {
    ;
    }

语法:int getchar(void); 从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符(‘\n’)时退出。键盘输入的字符都存到缓冲区内, 一旦键入回车, getchar就进入缓冲区读取字符, 一次只返回第一个字符作为getchar函数的值, 如果有循环或足够多的getchar语句, 就会依次读出缓冲区内的所有字符直到’\n’。要理解这一点, 之所以你输入的一系列字符被依次读出来, 是因为循环的作用使得反复利用getchar在缓冲区里读取字符, 而不是getchar可以读取多个字符, 事实上getchar每次只能读取一个字符.如果需要取消’\n’的影响, 可以用getchar()来清除,如:while((temp = getchar()) != ’\n’);,
这里getchar(); 只是取得了’\n’但是并没有赋给任何字符变量, 所以不会有影响, 相当于清除了这个字符。

这段代码会去掉回车和回车之前的所有的输入
其实不用这么写
直接
fflush(stdin);

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7775572
  • 这篇博客也不错, 你可以看下C语言清空缓冲区
  • 您还可以看一下 李南江老师的零基础学会C语言课程中的 清空输入缓冲区(掌握)小节, 巩固相关知识点
  • 除此之外, 这篇博客: C语言之清空缓存区中的 2.清空缓存区 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    所以我们要对缓存区清空是很重要的,在这里我们给出了下面三种办法来实现:

    • 使用fflush()函数

    fflush()函数冲洗流中的信息,该函数通常用于处理磁盘文件。清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时。fflush()函数包含在stdio.h头文件中。
    函数原:int fflush(FILE *stream),在这里的stream就是所要清除缓存区的文件。
    函数的返回值:当进行刷新成功返回0,失败返回EOF。没有缓冲区或者只读打开时也返回0值。还有需要注意的是:如果fflush返回EOF,数据可能由于写错误已经丢失。
    用法示例:fflush(stdin)刷新标准输入缓冲区,fflush(stdout)刷新标准输出缓冲区。 printf(“。。。。。。。。。。。”);后面加fflush(stdout);可提高打印效率
    代码示例:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        int num;
        char a;
        scanf("%d", &num);
        a = getchar();
        printf("num=%d,a=%c\n", num, a);
        system("pause");
        return 0;
    }

    这里写图片描述
    在执行这个程序的时候我们会发现,在我们输入第一个字符后敲击‘\n’之后,程序就结束了,这是因为我们没有清空缓存区,getchar()函数接收的是‘\n’,最后造成了程序的停止。
    接下来我们来使用fflush()函数。

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        int num;
        char a;
        scanf("%d", &num);
        fflush(stdin);
        a = getchar();
        printf("num=%d,a=%c\n", num, a);
        system("pause");
        return 0;
    }
    

    这里写图片描述
    我们在这里可以看到,当使用了fflush()函数对输入流进行清空缓存区以后,就可以正常让getchar函数接收字符。
    接下来是第二种方法。

    • 使用while((ch = getchar()) != ‘\n’ && ch != EOF);语句

      这种方法是最好的方法,可以称为万能清空缓存区御语句。
      代码示例:

    #include <stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        char c1 = 0;
        char c2 = 0;
        scanf("%c", &c1);
        c2 = getchar();
        printf("c1=%d,c2=%c", c1, c2);
        system("pause");
        return 0;
    }

    这里写图片描述

    在这里我们依然没有清空缓存区,得到的效果是这样的,getchar()函数依然接收了’\n’,造成程序停止。
    接下来,我们使用while((ch = getchar()) != ‘\n’ && ch != EOF);语句

    #include <stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        char c1 = 0;
        char c2 = 0;
        int ch;
        scanf("%d", &c1);
        while ((ch = getchar()) != EOF && ch != '\n')
        {
            ;
        }
        c2 = getchar();
        printf("c1=%d,c2=%c", c1, c2);
        system("pause");
        return 0;
    }

    这里写图片描述

    加入了while ((ch = getchar()) != EOF && ch != ‘\n’);语句,完成了清空缓存区
    事实上有时我们会将这个语句封装在一个函数中,这样会让程序的可移植性更强。

    #define CLEAR_BUF \
        {\
        int ch; \
    while ((ch = getchar()) != EOF && ch != '\n')\
            {\
            ; \
            }\
        }
    
    
    #include <stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        char c1 = 0;
        char c2 = 0;
        scanf("%d", &c1);
        CLEAR_BUF
            c2 = getchar();
        printf("c1=%d,c2=%c", c1, c2);
        system("pause");
        return 0;
    }

    这里写图片描述
    依然可以达到我们要的效果。

    • setbuf()函数关闭缓存区

    接下来我们要说另外一种清空缓存区的方法,与其说是清空缓存区,不如说他是关闭缓存区。
    setbuf()函数
    是linux中的C函数,主要用于打开和关闭缓冲机制。包含在头文件stdio.h中。
    setbuf函数具有打开和关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ的缓冲区。通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可以将其设置为行缓冲。为了关闭缓冲,可以将buf参数设置为NULL。
    函数原型:void setbuf(FILE *stream,char *buf);一个参数是文件流,一个参数是buf指向的缓冲区长度,这个长度就是在stdio.h中定义的宏BUFSIZ所决定的。当定义buf为空时,setbuf函数将使的文件I/O不带缓冲。

    #include <stdio.h>
    #include<stdlib.h>
    char outbuf[50];
    int main(void)
    {
        /* 将outbuf与stdout输出流相连接 */
        setbuf(stdout, outbuf);
        /* 向stdout中放入一些字符串 */
        puts("This is a test of buffered output.");
        puts("This output will go into outbuf");
        puts("and won't appear until the buffer");
        puts("fills up or we flush the stream.\n");
        /* 以下是outbuf中的内容 */
        puts(outbuf);
        /*刷新流*/
        fflush(stdout);
        system("pause");
        return 0;
    }
    

    这里写图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^