关于fflush的功能


fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]
 fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上

如上,为 百度百科上对fflush的用法的部分内容解释。

C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些 编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,经我的GCC4.6.2测试),因为标准中根本没有定义 fflush(stdin)。
MSDN 文档里也清楚地写着:

fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。

以下是 C99 对 fflush 函数的定义:

int fflush(FILE *stream); 如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush函数会给那些流打上错误标记,并且返回EOF,否则返回0。

由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的。


代码说话:


#include<iostream>
using namespace std;

int main()
{
     int a;
     char str[10];
     cin>>a;
     cout<<a<<endl;
     printf("%d",fflush(stdin));
     cin>>str;
     cout<<str<<endl;
	 getchar();
     return 0;
}


如上代码,在g++和Visual c++上将会出现不同状况:

CentOS 6.4 final   [gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)]

12 12
12
012

Visual C++下

12 12
12
0
12
12

你可能感兴趣的:(关于fflush的功能)