fflush(stdin)的对错?

匚匚 2010-04-10 05:06:30
以前经常看见回复中有用fflush(stdin);来清空输入缓存的,自己也没多想,也跟着这样用了,而且好像也达到了效果。
在看了《The C Programming Language》的第8.3节后,感觉有问题。在关于fflush的习题答案代码中,有这样的语句:

if ((f->flag & _WRITE) == 0)
return -1;
不是以写方式打开的根本什么都没做嘛!而stdin初始化时,_flag值为_READ。
另:
_iob是一个结构体数组吧,见下面的定义
extern FILE _iob[OPEN_MAX];
可为什么习题答案中有这样的语句:
for (i = 0; i < OPEN_MAX; i++)
{
if ((_iob[i]->flag & _WRITE) && (fflush(_iob[i]) == -1))
retval = -1;
}
_iob[i]->flag 是不是应改为_iob[i].flag ?fflush(_iob[i]) 改为fflush(&_iob[i])?

习题答案地址为:http://users.powernet.co.uk/eton/kandr2/krx803.html
...全文
725 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
匚匚 2010-04-15
  • 打赏
  • 举报
回复
开卷有益
[Quote=引用 32 楼 wolf0403 的回复:]
. -> 这种基础问题,看书是王道。楼主不要浪费看帖人的时间了,标准答案2楼已经有了。
[/Quote]
Wolf0403 2010-04-15
  • 打赏
  • 举报
回复
. -> 这种基础问题,看书是王道。楼主不要浪费看帖人的时间了,标准答案2楼已经有了。
匚匚 2010-04-15
  • 打赏
  • 举报
回复
对否?请指正
cocat 2010-04-14
  • 打赏
  • 举报
回复
学习了
taodm 2010-04-14
  • 打赏
  • 举报
回复
你没看过建设性在哪里不代表就不具有建设性。
想获得高质量的答案需要有高质量的提问,加反思的心态。
匚匚 2010-04-14
  • 打赏
  • 举报
回复
“->” 的前面应该是指向结构体的指针,而“.”的前面应是结构体
不知对否,请指正
[Quote=引用 28 楼 gblacksheep 的回复:]
楼主你想问的是_iob[i]->flag 是不是应改为_iob[i].flag 你就应该看看->flag和.flag的区别 建议看看数据结构 关于结构体数组的部分
[/Quote]
gblacksheep 2010-04-14
  • 打赏
  • 举报
回复
楼主你想问的是_iob[i]->flag 是不是应改为_iob[i].flag 你就应该看看->flag和.flag的区别 建议看看数据结构 关于结构体数组的部分
匚匚 2010-04-14
  • 打赏
  • 举报
回复
呵呵,还好(只是不爽,当然,我以后会注意的,呵呵)
[Quote=引用 26 楼 zht_304 的回复:]
我第一次遇到这个问题,也是来csdn问的。当时去查了C programming,是未定义的。不过确实能解决问题。 我也用这句 回答过别人的问题。 呵呵。 看来真的不够严谨了。

可是, LZ, 我对你的用词很不爽啊~~
[/Quote]
zht_304 2010-04-14
  • 打赏
  • 举报
回复
我第一次遇到这个问题,也是来csdn问的。当时去查了C programming,是未定义的。不过确实能解决问题。 我也用这句 回答过别人的问题。 呵呵。 看来真的不够严谨了。

可是, LZ, 我对你的用词很不爽啊~~
bobo364 2010-04-13
  • 打赏
  • 举报
回复
清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbuf(stdin, NULL);就能直接清空键盘缓冲区了。

/*  

02 * 本程序适用于 Windows 和 Linux 系统,

03 * 测试环境:

04 * Windows XP,Microsoft Visual C++ 6.0 SP6

05 * Ubuntu Linux 8.04, NetBeans IDE 6.7

06 */

07

08 #include <stdio.h>

09

10 int main()

11 {

12 char ch1;

13 char ch2;

14

15 scanf("%c", &ch1);

16 printf("ch1 = %d", ch1);

17

18 setbuf(stdin, NULL); /*清空缓冲区*/

19

20 scanf("%c", &ch2);

21 printf("ch2 = %d", ch2);

22 return 0;

23 }
taodm 2010-04-13
  • 打赏
  • 举报
回复
你知道了fflush是不正确的,那如何清空输入缓存你有答案么?

[Quote=引用 14 楼 zhw952 的回复:]

要让更多的人知道,免受无良回复之害!
引用 13 楼 taodm 的回复:
到2楼就可以结贴了。
[/Quote]
匚匚 2010-04-13
  • 打赏
  • 举报
回复
你的回复也没有多少建设性!
我想悄悄地对你说,艺高不如德行好!如果你不能接受这句话,请你以后不要理我了,呵呵
[Quote=引用 19 楼 taodm 的回复:]
你知道了fflush是不正确的,那如何清空输入缓存你有答案么?


引用 14 楼 zhw952 的回复:

要让更多的人知道,免受无良回复之害!
引用 13 楼 taodm 的回复:
到2楼就可以结贴了。
[/Quote]
jackyjkchen 2010-04-13
  • 打赏
  • 举报
回复
一般在输入函数后跟一个getchar,也可以刷新缓冲区,可靠性不晓得,反正gcc也支持getchar就是了
匚匚 2010-04-13
  • 打赏
  • 举报
回复
while((c=getchar())!=EOF && c!='\n');
可否?
fseek(stdin,0L,2);可否?
rewind(stdin);可否?
[Quote=引用 19 楼 taodm 的回复:]
你知道了fflush是不正确的,那如何清空输入缓存你有答案么?


引用 14 楼 zhw952 的回复:

要让更多的人知道,免受无良回复之害!
引用 13 楼 taodm 的回复:
到2楼就可以结贴了。
[/Quote]
LittleJohny 2010-04-13
  • 打赏
  • 举报
回复
mark 一下
Zijian_Zhang 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 guoyu_bo 的回复:]
我一般都用rewind(stdin);
[/Quote]

http://cboard.cprogramming.com/c-programming/84624-rewind-stdin-%3B-right-wrong.html
wade_2003 2010-04-12
  • 打赏
  • 举报
回复
没用过,看别人用过。
taodm 2010-04-12
  • 打赏
  • 举报
回复
到2楼就可以结贴了。
guoyu_bo 2010-04-12
  • 打赏
  • 举报
回复
我一般都用rewind(stdin);
2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mstlq 的回复:]

C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflus……
[/Quote]
不惜牺牲得分率 up 之~
加载更多回复(13)

69,700

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧