我想对这个命令在后台如何工作有更好的了解。
我一开始尝试在scanf()
收到char
而不是预期的int
时阻止我的应用程序失败。提供给我的解决方案是添加行while (getchar() != '\n');
以清除输入缓冲区。
而且有效。太好了!
但是由于我本来是使用scanf()
而不是getchar()
,所以我发现使用完全不同的命令来清除缓冲区的输入感到有些困惑。
我已经进行了一次谷歌搜索,据我所知,getchar()
使用stdin
,这就是该命令正在清除的缓冲区。通过扩展,这也意味着在这种情况下scanf()
也正在使用stdin
。
这个假设正确吗?
答案 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读取数据 ,并根据参数进行存储 格式化为其他参数所指向的位置。