输出缓冲区
程序并不会立即把输出的数据显示到屏幕上,而是先存储在输出缓冲区,当满足一定条件时才会显示出来
1、遇到 \n
2、程序结束
3、遇到输入语句时
4、当缓冲区满4k时
5、fflush(stdout) 手动刷新
优点:缓冲区机制可以提高数据的读写速度,并且可以让低速的输入输出设备科高速的CPU之间协调工作
输入缓冲区:
1、程序并不会立即获取屏幕上输入的数据,而是按下回车健后程序才会从输入缓冲区读取数据
2、可能出现的问题:
1)当需要读取的是整型或者浮点型时,而输入缓冲区中的数据是字符或者符号时,此时会读取失败,数据会残留在输入缓冲区中,就会影响接下来所有的数据的读取
2)fgets可以指定读取size-1个字符,如果有多余的会残留在输入缓冲区中,影响下一次输入
3)当先输入整型或者浮点型数据,在紧接着输入字符、字符串时,前一次残留的‘\n’或空格,会影响字符、字符串的输入
3、解决方案:
1)%c 前面加空格 scanf(" %c",&ch);
2)
方法一、
必须确认输入缓冲区中有垃圾数据时,才能去读取丢弃输入缓冲区的垃圾数据,否则程序会停下来等待缓冲区中有一个\n
scanf("%*[^\n]"); 表示从缓冲区中接受任意字符并丢弃,只要不是\n就一直进行,遇到\n才停下
scanf("%*c"); 丢弃任意字符,把\n丢掉
方法二、
工作原理:借助缓冲区的位置指针移动到缓冲区末尾,实现清理缓冲区的效果
缺点:只能在Linux下使用
stdin->_IO_read_ptr = stdin->_IO_read_end;
3)借助scanf返回值判断是否接收成功,如果接受过程有失败情况,可以先清理输入缓冲区,在重新循环接收数据,直到接收成功为止