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)。
函数会给那些流打上错误标记,并且返回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)){//如果用户输入文件结束标志(或文件已被读完),或者发生读写错误,则退出循环//dosomethingbreak;}//没有发生错误,清空输入流。通过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) 收藏 举报
浙公网安备 33010602011771号