因此,在谷歌上快速搜索fflush(stdin)以清除输入缓冲区,会显示许多网站警告不要使用它。然而,这正是我的CS教授教给全班的方法。
使用fflush(stdin)有多糟糕?我真的应该放弃使用它吗,即使我的教授正在使用它,它似乎工作得无懈可击?
发布于 2010-06-05 12:53:40
简单:这是未定义的行为,因为fflush是在输出流上调用的。这是C标准的一段摘录:
int fflush(文件*对象流);
ostream指向未输入最新操作的输出流或更新流,则fflush函数会使要传送到主机环境的流的任何未写入数据都写入文件;否则,行为是未定义的。
所以这不是“有多糟糕”的问题。fflush(stdin)是不可移植的,所以如果您希望代码在编译器之间可移植,就不应该使用它。
发布于 2010-06-05 13:10:39
根据该标准,fflush只能与输出缓冲区一起使用,显然stdin不是其中之一。但是,some标准C库提供了将fflush(stdin)用作扩展的功能。在这种情况下,您可以使用它,但它会影响可移植性,因此您将不能再使用地球上任何符合标准的标准C库,并期望得到相同的结果。
发布于 2019-11-16 04:18:41
我相信你永远不应该调用fflush(stdin),原因很简单,一开始你就不应该尝试刷新输入。实际上,您可能认为必须刷新输入的原因只有一个,那就是:通过scanf卡住的一些糟糕的输入。
例如,您可能有一个程序在循环中使用scanf("%d", &n)读取整数。很快您就会发现,当用户第一次输入像'x'、the program goes into an infinite loop这样的非数字字符时。
面对这种情况,我相信你基本上有三个选择:
fflush(stdin),则通过在循环中调用getchar来读取字符直到\n,这通常是在数字为expected.scanf to read input.时让用户不键入非数字字符
现在,如果你是一个初学者,scanf似乎是阅读输入的最简单的方法,所以选择#3看起来既可怕又困难。但是#2似乎是一个真正的逃避,因为每个人都知道用户不友好的计算机程序是一个问题,所以如果做得更好就好了。因此,太多的初学者被逼到了墙角,他们觉得自己别无选择,只能做第一件事。他们或多或少必须使用scanf进行输入,这意味着它将被错误的输入卡住,这意味着他们必须找出一种方法来清除错误的输入,这意味着他们非常想使用fflush(stdin)。
我想鼓励所有初学C语言的程序员做一套不同的权衡:
scanf之外的任何东西之前,请不要担心输入不好。真的。继续使用上面的cop-out #2。这样想:你是一个初学者,有很多事情你还不知道怎么做,其中一件你还不知道怎么做的事情是:优雅地处理意想不到的输入。尽快
scanf。在这一点上,您可以开始优雅地处理错误的输入,您将拥有更多、更好的技术可用,根本不需要尝试“清除错误的输入”。或者,换句话说,仍然坚持使用scanf的初学者应该自由地使用cop-out #2,当他们准备好后,他们应该从那里过渡到技术#3,并且根本不应该使用技术#1来尝试刷新输入--当然不应该使用fflush(stdin)。
https://stackoverflow.com/questions/2979209
复制相似问题