fflush(stdout)和fflush(stdin)
fflush(stdin) : 即清理标准输入流,把多余的仍未被保存的数据丢掉。
fflush(stdout) : 清空输出缓冲区,并把缓冲区内容输出
fflush函数被广泛使用在多线程、网络编程的消息处理中。
解决scanf()输入函数缓冲区残留的问题。
大家都说用fflush(stdin)进行强制刷新,但是在Linux上的GCC不起什么作用。
文章转至:http://my.oschina.NET/deanzhao/blog/79790
#include <stdio.h>
int main()
{
int i,c;
for(;;)
{
printf("input :");
#if 0
if( feof(stdin) || ferror(stdin) )
{
printf("error\n");
break;
}
printf("up\n");
while( (c = getchar()) != '\n' && c != EOF )
;
#endif
printf("down\n");
//fflush(stdin);
//fflush(stdout);
printf("%d\n",i);
}
return 0;
}
程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,
程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户 输入。
但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,
那么程序会不停地输出“Please input an integer: 2”。
这是因为 scanf(“%d”, &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。
因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,
这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。
C和C++的标准里从来没有定义过 fflush(stdin)。
也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”
的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,
但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),
因为标准中根本没有定义 fflush(stdin)。
以上将被注释的代码用上,就能解决缓冲区残留的问题