美文网首页C程序员
C语言缓冲区导致的问题和缓冲区的清理方法

C语言缓冲区导致的问题和缓冲区的清理方法

作者: taobao | 来源:发表于2020-07-27 14:41 被阅读0次

先看一个段简单的程序:

#include <stdio.h>
#include <stdlib.H>

int main() {
    int a;
    char b;
    char c[10] = "123";

    scanf("%d", &a);
    scanf("%c", &b); 
    scanf("%s", c);
    printf("数字:%d 字符:%c 字符串:%s", a, b, c);

    return 0;
}

执行程序,会发现,字符b,竟然接收了换行符 或者 空格(单行输入 空位分隔)。

处理方法,在读取单个字符前,先清空缓冲区:

1:使stdin输入流由默认缓冲区转为无缓冲区
  setbuf(stdin, NULL);
2:不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止
   while ((b = getchar()) != EOF && b != '\n');
3:清空缓冲区,读取非换行字符舍去掉,再读取一个字符舍去掉
  scanf("%*[^\n]"); scanf("%*c");
缓冲区的刷新(清空)

所谓刷新缓冲区,就是将缓冲区中的内容送达到目的地。缓冲区的刷新遵循以下的规则:

  • 不管是行缓冲还是全缓冲,缓冲区满时会自动刷新;
  • 行缓冲遇到换行符\n时会刷新;
  • 关闭文件时会刷新缓冲区;
  • 程序关闭时一般也会刷新缓冲区,这个是由标准库来保障的;
  • 使用特定的函数也可以手动刷新缓冲区

相关文章

网友评论

    本文标题:C语言缓冲区导致的问题和缓冲区的清理方法

    本文链接:https://www.haomeiwen.com/subject/kmezlktx.html