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

先看一个段简单的程序:

#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时会刷新;
  • 关闭文件时会刷新缓冲区;
  • 程序关闭时一般也会刷新缓冲区,这个是由标准库来保障的;
  • 使用特定的函数也可以手动刷新缓冲区
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容