首先介绍两个先验知识:
函数fflush:
功能:清除读写缓冲区
头文件:stdio.h
原型:int fflush(FILE *stream);
例: fflush(stdin)---->把输入缓冲区里的东西丢弃,并不一定会成功,gcc就不可以,vc貌似可以;fflush(stdout)把输出缓冲区里的东西打印到标准输出设备上
标准I/O缓冲区:
标准i/O提供缓存的目的是尽可能减少使用read和write调用的次数。标准I/O提供类三种类型的缓冲
- 全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际的I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实现全缓冲的。在一个流上执行第一次I/O操作时,相关的标准I/O函数通常调用malloc获取需要使用的缓冲区。
- 行缓冲。在这种情况下,当输入输出中遇到换行符时,标准I/O库执行I/O操作。当流涉及终端时,通常使用行缓冲。因为标准I/O库用来收集每一行的缓冲区长度是固定的,所以只要填满类缓冲区,那么即使还没有写一个换行符,也进行I/O操作
- 不带缓冲。标准I/O库不对字符进行行缓冲存储。标准出错流stderr通常是不带缓冲的,这就使得出错信息可以尽快的显示出来。
ISO C 要求下列缓冲特征:
- 当且仅当标准输入和标准输出不涉及交互设备时,它们才是全缓冲的
- 标准出错绝不会是全缓冲的
下文中:<-表示按enter键
scanf&