c语言中fflush(stdin)作用(转)
(2009-04-09 16:43:00)
标签:
杂谈
1、C99 对 fflush
函数的定义:
int fflush(FILE *stream);
如果stream指向输出流或者更新流(update
stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。
fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush函数会给那些流打上错误标记,并且返回EOF,否则返回0。
由此可知,如果 stream 指向输入流(如
stdin),那么 fflush
函数的行为是不确定的。故而使用 fflush(stdin)
是不正确的,至少是移植性不好的。
,成功返回0,出错返回EOF。
2、使用注意点及误区
为什么 fflush(stdin) 是错的?
首先请看以下程序:
便宜香港vps
Quote:
程序代码 程序代码
#i nclude
int main( void )
{
int i;
for (;;) {
fputs(“Please input an integer: “, stdout);
scanf(“%d”, &i);
printf(“%d\n”, i);
}
return 0;
}
这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设
scanf 函数最后一次得到的整数是 2
,那么程序会不停地输出“Please input an
integer: 2”。这是因为 scanf(“%d”,
&i);
只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而
scanf
函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please
input an integer: 2”。
也许有人会说:“居然这样,那么在
scanf
函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过
fflush(stdin)。也许有人会说:“可是我用
fflush(stdin)
解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用
fflush(stdin)
来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义
fflush(stdin)。MSDN 文档里也清楚地写着 fflush on input
stream is an extension to the C standard (fflush
操作输入流是对C标准的扩充)。当然,如果你毫不在乎程序的移植性,用
fflush(stdin) 也没什么大问题。
2. 清空输入缓冲区的方法
虽然不可以用
fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在
scanf 函数后面加上几句简单的代码就可以了。
Quote:
程序代码 程序代码
#i nclude
int main( void )
{
int i, c;
for (;;) {
fputs(“Please input an integer: “, stdout);
if ( scanf(“%d”, &i) != EOF ) {
while ( (c=getchar()) != ‘\n’ && c
!= EOF ) {
;
}
}
printf(“%d\n”, i);
}
return 0;
}
运行结果:
当输入数字时,正常;
当输入字母时,i的值不改变,printf输出的仍是上一次的值。由于输入缓冲区每次都被清空,所以也就不存在scanf自动不停读取缓冲区的值的情况。
Quote:
#i nclude
#i nclude //
为了使用numeric_limits
using std::cout;
using std::endl;
using std::cin;
int main( )
{
int value;
for (;;) {
cout << “Enter an integer: “;
cin >> value;
cin.clear( );
cin.ignore(
std::numeric_limits<:streamsize>::max(
), ‘\n’ );
cout << value
<< ‘\n’;
}
return 0;
}
该版本有待进一步研究。之前在C++
Primer上讲述过其细节。
分享:
喜欢
0
赠金笔
加载中,请稍候……
评论加载中,请稍候…
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵???称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
11061423