欢迎光临
我们一直在努力

c语言中的fflush,fflush(stdin)函数什么作用

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

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。