一、输出缓冲区
缓冲区机制可以提高数据的读写速度,还可以让低速的设备与高速的CPU之间系统工作。程序要显示的数据并不会立即显示到屏幕上,而是先存储到输出缓冲区中,当满足一定条件时才会从输出缓冲区显示到屏幕上。
1、遇到'\n'
2、遇到输入语句
3、当缓冲区满了4k
4、程序正常结束时
5、fflush(stdout); 手动刷新输出缓冲区
二、输入缓冲区
程序中输入的数据并不会立即从键盘接收到变量中,而是当按下回车后先存储到输入缓冲区中,然后再从缓冲区中读取到变量内存中。下面将分析三种不同情况及解决方法。
情况1:需要输入的是整型\浮点型时,而缓冲区中的数据是字符型或符号时,此时读取会失败,并且该数据会继续残留在输入缓冲区中,会继续影响剩下的输入。
解决方法:根据scanf的返回值判断输入是否有问题,如果读取失败,则先清理输入缓冲区后重新输入,直到读取成功为止。
情况2:通过fgets可以指定读取size-1个字符,但是如果输入超过size-1那么字符会残留在输入缓冲区中,继续影响接下来的输入。
解决方法1:
int len = 0;
while(str1[len]) len++; //len是'\0'的下标,除去结束符长度
if('\n' != str1[len-1])// '\0'前面不是'\n'则清理
//最后接收的数据不是'\n'则缓冲区一定会残留'\n'及后面数据影响下一个fgets,该类函数均是从缓冲区获取数据。
{
scanf("%*[^\n]");
//从缓冲区中读取任意类型数据并丢弃,直到遇到'\n'停止
scanf("%*c");
//从缓冲区中读取任意字符类型数据并丢弃
}
解决方法2:
stdin->_IO_read_ptr = stdin->_IO_read_end;
// 把输入缓冲区的位置指针从当前位置,移动到末尾,相当于清理输入缓冲区。
注意:只能在Linux系统下使用。
情况3:当先输入整型或浮点型,再输入字符型时,输入完整型或浮点型后按下的回车或空格,会残留在输入缓冲区,刚好被后面的字符型接收,影响输入。
解决方法:在%c或者gets()前面加空格。
scanf(" %c");