C99的fflush函数

来自百度百科关于scanf函数的词条:
http://baike.baidu.com/link?url=4oDIKyFJm-oKFNNtjytChY-NOJDcp3Wf7pIJ-0K6UqCijU7-xc4iYTuZsP4SEWoMMUyf8PlBRBQiaG6XqvYq-K
 
 
"补充
fflush(stdin)这个方法在GCC下不可用。(在VC6.0下可以)
以下是 C99 对 fflush 函数的定义:
int fflush(FILE *stream);
如果stream指向输出流或者更新流(update stream),并且这个更新流
执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream
指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。
C和C++的标准里从来没有定义过 fflush(stdin)
fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush
函数会给那些流打上错误标记,并且返回EOF,否则返回0。
由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用
fflush(stdin) 是不正确的,至少是移植性不好的。
可采用如下方法:
方法一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*此函数可以和scanf函数一起使用,但使用%c输入时要注意,即此函数只能用于缓冲区非空的情况*/
#include<stdio.h>
void flush()
{
char c;
while((c=getchar())!='\n'&&c!=EOF);
}
int main(void)
{
inta,b,c;/*计算a+b*/
while(scanf("%d%d",&a,&b)!=2)
flush();
c=a+b;
printf("%d+%d=%d",a,b,c);
return 0;
}
方法二:
程序示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
int main(void)
{
int i,c;
while(1)
{
printf("Please input an integer:");
scanf("%d",&i);
if(feof(stdin)||ferror(stdin))
{
//如果用户输入文件结束标志(或文件已被读完),或者发生读写错误,则退出循环
//dosomething
break;
}
//没有发生错误,清空输入流。通过while循环把输入流中的余留数据“吃”掉
while((c=getchar())!='\n'&&c!=EOF);
//可直接将这句代码当成fflush(stdin)的替代,直接运行可清除输入缓存流
//使用scanf("%*[^\n]");也可以清空输入流,不过会残留\n字符。
printf("%d\n",i);
}
return 0;
}
"

posted on 2015-02-16 21:56  True2009Fans  阅读(200)  评论(0)    收藏  举报