while((c = getchar()) != '\n' && c != EOF);
我正在尝试考虑场景为什么以及如何在此函数中需要EOF来清空标准输入?用户键入内容并按Enter键,我们清空缓冲区直到找到输入,EOF在哪里进来?
谢谢
编辑: 非常感谢您的第一个答案和第二个评论,它回答了我的问题并完全满足了我。
除了我们从一个我们有真实EOF的文件中输入输入的场景之外,我几乎已经回答了我的问题,我仍然不明白为什么我们在任何其他场景中需要EOF来实现这样的功能。用户只能在终端的一行开头调用EOF,因此不能用于清空缓冲区。
答案 0 :(得分:5)
如果用户插入Ctrl-D(在Linux / OS X上)或Ctrl-Z(在Windows上),则从stdin获取EOF。此外,标准输入可能会从文件中重定向 - 在这种情况下,最终您会得到一个真实的" EOF。
在这两种情况下,如果没有检查循环会永远持续下去,等待永远不会出现的换行符(在这里插入忧郁的音乐)。
答案 1 :(得分:4)
您的代码没有“刷新”stdin
。它只是搜索最近的'\n'
或输入的结尾,以先到者为准。
您可以在以下几种情况下获得EOF
:
stdin
的组合,这意味着下一次阅读尝试将返回EOF
或a.out <data.txt
你可能会这样做的原因可能有所不同,但大多数情况下它会清除以前无效输入的剩余部分。
答案 2 :(得分:1)
您出现的语句从stdin
读取当前行的剩余部分并将其丢弃,无论该行是以换行符结尾('\n'
)还是在流末尾({{1} }})。正如dasblinkenlight所观察到的那样,这不是通常所谓的“冲洗”。
EOF
在流末尾或出错时返回getchar()
,并EOF
,因此如果没有EOF != '\n'
检查,该语句会无限循环流的结束。
输入的最后一行绝不会是新行终止的。实际上,您可能会争辩说,流的最后一行是由流末尾终止的行,因此最后一行从不换行符终止,但它可能包含零个字符。