有什么写法可以代替fflush(stdin)

Tiwen 2006-01-20 08:20:20
因为fflush(stdin)可移值性不好。所以在考虑编程的时候尽量不考虑用fflush(stdin)。我做菜单时用的是CHAR 型,清除输入缓存自己写了句
if (scanf("%c",&ck)!=EOF)
while (getchar()!='\n'){;}
但此语句二次利用不可靠。会少清除些缓存。不知大家有没有更好的写法?
...全文
1102 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lujun-cc 2006-01-25
  • 打赏
  • 举报
回复 1
fflush只能用于VC中,该函数并非一个标准的C函数,是MS扩展的C函数!

要实现清空,可以这样:

char ch;

while ( (ch=getchar()) != '\n' && c != EOF );
al0n9 2006-01-25
  • 打赏
  • 举报
回复
设置stdin为非缓冲形式。
drageon77 2006-01-25
  • 打赏
  • 举报
回复
al0n9(al0n9): 设置stdin为非缓冲形式。
bo.cui 2006-01-23
  • 打赏
  • 举报
回复
while((c=getchar())!='\n'&&c!=EOF);

我也长用 确实不理想  所以写代码的时候  都加上很多提示输入
 比如"在不提示输入时,请不要按键,否则可能使程序异常终止"

其实也没办法  谁让fflush不通用呀!
FBIq 2006-01-21
  • 打赏
  • 举报
回复
这样应该可以呀
while((c=getchar())!='\n'&&c!=EOF);
Tiwen 2006-01-21
  • 打赏
  • 举报
回复
while((c=getchar())!='\n'&&c!=EOF);
这个我也试了的。有弊端。通过两个死循环也会出现一个没清出去。
晨星 2006-01-21
  • 打赏
  • 举报
回复
难道C怎么干净的语言不能完成同样操作的第二个办法吗?
——这种情况当然存在,原因就是你在使用别人写的库,而你又不能修改源代码。这样,只要别人没有提供第二个能完成同样功能的函数,你可能就只能是束手无策。
晨星 2006-01-21
  • 打赏
  • 举报
回复
这个调用本来就是个怪胎。
本来C语言I/O库的目标目标之一就是对各类文件提供统一的处理方式,包括一般的磁盘文件和特殊的设备文件等。而通常stdin也只有在指向标准键盘的时候,fflush一下可能还有点意义,否则,如果是一般的磁盘文件,“清空输入缓冲区”算个啥意思呢?把已经缓冲,尚未处理地都扔掉?对于一个打开的文件,库的底层实现者所用的缓冲区的大小、分配和使用的算法等等本来就没有个标准。而对于打开的方式,是只读,读写,是二进制,还是文本方式,导致flush的结果可能又不一样。
所以fflush一个输入流的行为标准并没有给出明确定义,碰到挠头的问题可能也就不怪了。
FBIq 2006-01-21
  • 打赏
  • 举报
回复
请不要用“好像”这个词,很容易误导人的!
VxD1 2006-01-21
  • 打赏
  • 举报
回复
fflush(stdin);
fflush好像只能用于输出吧fflush(stdout);
Tiwen 2006-01-20
  • 打赏
  • 举报
回复
难道C怎么干净的语言不能完成同样操作的第二个办法吗?
晨星 2006-01-20
  • 打赏
  • 举报
回复
那个if会导致等待输入吧,所以跟fflush(stdin)似乎很不一样。

我一直觉得之所以会需要进行fflush(stdin),在很大程度上是由于Windows的CRT中,scanf,getchar等输入函数在遇到回车换行时所表现出的行为与标准不符所致,所以大概fflush(stdin)也只有在使用Windows的CRT时有用,离开了Windows平台,基本也就没有这个必要使用它了。所以,干脆把一切fflush(stdin)放进:
#if defined(_WINDOWS) || defined(DOS)
fflush(stdin);
#endif
算了。
个人想法。

69,335

社区成员

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

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