首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fflush(stdin)

使用fflush(stdin)
EN

Stack Overflow用户
提问于 2010-06-05 12:50:24
回答 6查看 54.4K关注 0票数 90

因此,在谷歌上快速搜索fflush(stdin)以清除输入缓冲区,会显示许多网站警告不要使用它。然而,这正是我的CS教授教给全班的方法。

使用fflush(stdin)有多糟糕?我真的应该放弃使用它吗,即使我的教授正在使用它,它似乎工作得无懈可击?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-05 12:53:40

简单:这是未定义的行为,因为fflush是在输出流上调用的。这是C标准的一段摘录:

int fflush(文件*对象流);

ostream指向未输入最新操作的输出流或更新流,则fflush函数会使要传送到主机环境的流的任何未写入数据都写入文件;否则,行为是未定义的。

所以这不是“有多糟糕”的问题。fflush(stdin)是不可移植的,所以如果您希望代码在编译器之间可移植,就不应该使用它。

票数 85
EN

Stack Overflow用户

发布于 2010-06-05 13:10:39

根据该标准,fflush只能与输出缓冲区一起使用,显然stdin不是其中之一。但是,some标准C库提供了将fflush(stdin)用作扩展的功能。在这种情况下,您可以使用它,但它会影响可移植性,因此您将不能再使用地球上任何符合标准的标准C库,并期望得到相同的结果。

票数 22
EN

Stack Overflow用户

发布于 2019-11-16 04:18:41

我相信你永远不应该调用fflush(stdin),原因很简单,一开始你就不应该尝试刷新输入。实际上,您可能认为必须刷新输入的原因只有一个,那就是:通过scanf卡住的一些糟糕的输入。

例如,您可能有一个程序在循环中使用scanf("%d", &n)读取整数。很快您就会发现,当用户第一次输入像'x'the program goes into an infinite loop这样的非数字字符时。

面对这种情况,我相信你基本上有三个选择:

  1. 以某种方式刷新输入(如果不使用fflush(stdin),则通过在循环中调用getchar来读取字符直到\n,这通常是在数字为expected.
  2. Use something other than scanf to read input.

时让用户不键入非数字字符

现在,如果你是一个初学者,scanf似乎是阅读输入的最简单的方法,所以选择#3看起来既可怕又困难。但是#2似乎是一个真正的逃避,因为每个人都知道用户不友好的计算机程序是一个问题,所以如果做得更好就好了。因此,太多的初学者被逼到了墙角,他们觉得自己别无选择,只能做第一件事。他们或多或少必须使用scanf进行输入,这意味着它将被错误的输入卡住,这意味着他们必须找出一种方法来清除错误的输入,这意味着他们非常想使用fflush(stdin)

我想鼓励所有初学C语言的程序员做一套不同的权衡:

  1. 在您C编程生涯的早期阶段,在您习惯使用除scanf之外的任何东西之前,请不要担心输入不好。真的。继续使用上面的cop-out #2。这样想:你是一个初学者,有很多事情你还不知道怎么做,其中一件你还不知道怎么做的事情是:优雅地处理意想不到的输入。

尽快

  1. learn how to do input using functions other than scanf。在这一点上,您可以开始优雅地处理错误的输入,您将拥有更多、更好的技术可用,根本不需要尝试“清除错误的输入”。

或者,换句话说,仍然坚持使用scanf的初学者应该自由地使用cop-out #2,当他们准备好后,他们应该从那里过渡到技术#3,并且根本不应该使用技术#1来尝试刷新输入--当然不应该使用fflush(stdin)

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2979209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档