了解“ while(getchar()!='\ n')”

时间:2019-01-30 10:47:49

标签: c scanf getchar

我想对这个命令在后台如何工作有更好的了解。

我一开始尝试在scanf()收到char而不是预期的int时阻止我的应用程序失败。提供给我的解决方案是添加行while (getchar() != '\n');以清除输入缓冲区。 而且有效。太好了!

但是由于我本来是使用scanf()而不是getchar(),所以我发现使用完全不同的命令来清除缓冲区的输入感到有些困惑。

我已经进行了一次谷歌搜索,据我所知,getchar()使用stdin,这就是该命令正在清除的缓冲区。通过扩展,这也意味着在这种情况下scanf()也正在使用stdin

这个假设正确吗?

2 个答案:

答案 0 :(得分:2)

是的,就是这种情况。在文档中有明确提及。

引用C11标准,第7.21.6.2章

  

在控制之下,fscanf函数从stream指向的流中读取输入   指定所允许的输入序列的格式所指向的字符串的形式,以及如何   它们将被转换为赋值,并使用后续参数作为指向   对象以接收转换后的输入。 [....]

和第§7.21.6.4

  

scanf函数等效于fscanf,其中插入了参数stdin   在scanf的参数之前。


仅添加一点说明为什么stdin也从scanf()读取时为什么需要getchar()来清除stdin

scanf()仅在匹配成功时从输入缓冲区中读取,并由指定允许的输入序列的格式所指向。如果匹配失败(这是您的情况),则在期望char的地方提供int(很可能是用户使用了%d转换说明符),缓冲区中的输入仍未读取,并且可以在下次调用scanf()时读取。

因此,如果调用了scanf(),则始终建议检查故障并使用getchar()清除缓冲区,该缓冲区逐字符读取stdin并返回在每次调用中,将字符读取为unsigned char并强制转换为int,从而消耗了缓冲区中的 any 条目并将其清除。

答案 1 :(得分:1)

  

我已经在谷歌搜索了一下,据我所知,'getchar()'   使用“ stdin”,这是正在清除的缓冲区   命令。通过扩展,这也意味着“ scanf”也在使用   在这种情况下为“ stdin”。这个假设正确吗?

是的,没错。

根据documentation(强调我的意思):

  

[scnaf]从stdin读取数据 ,并根据参数进行存储   格式化为其他参数所指向的位置。