先看一个段简单的程序:
#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时会刷新;
- 关闭文件时会刷新缓冲区;
- 程序关闭时一般也会刷新缓冲区,这个是由标准库来保障的;
- 使用特定的函数也可以手动刷新缓冲区