紧跟在scanf之后的while循环中的getchar()
在堆栈溢出问题上有几个问题,综合起来,可能会回答这个问题。然而,我只是想毫无疑问地确保下面对代码段的解释是正确的 在“C编程:一种现代方法”中,偶尔会看到以下代码习惯用法,其中涉及紧跟在scanf之后的while循环中的getchar(),c,input,C,Input,在堆栈溢出问题上有几个问题,综合起来,可能会回答这个问题。然而,我只是想毫无疑问地确保下面对代码段的解释是正确的 在“C编程:一种现代方法”中,偶尔会看到以下代码习惯用法,其中涉及scanf()函数和getchar()函数。考虑下面的例子,取自第392页: int main(void) { char code; for (;;) { printf("Enter operation code: "); scanf(" %c", &am
scanf()
函数和getchar()
函数。考虑下面的例子,取自第392页:
int main(void)
{
char code;
for (;;) {
printf("Enter operation code: ");
scanf(" %c", &code);
while(getchar() != '\n')
;
.../*other stuff*/
}
}
以下是我对while
循环中嵌入的getchar()
函数的理解
当提示用户输入字符时,用户很可能将许多按钮(例如,abcdefg 12 3、.f
)按入命令终端
在缺少getchar()
行的情况下,scanf()
(嵌入到无限循环中)将以迭代方式通过该输入缓冲区
i、 e.在第一次传递时,code
将被分配字符'a'
,并且输入缓冲区将具有bcdefg 12 3。f
剩余…在第二次通过无限for
循环时,code
将被分配字符'b'
和cdefg 12 3。f
将剩余…等
但是,通过包含getchar()
行,我们有效地耗尽了输入缓冲区,因此在进入\*其他内容*\
部分之前,输入缓冲区是完全空的
这是正确的想法吗
如果是,那么我的最后一个问题是为什么getchar()
行需要写成!='\n'
。难道我不能把这个条件写成不等于任何东西吗?e、 g.!=','代码>或!='d'
或!=''代码>等等
是否只是为了可读性(即符合使用Enter按钮向计算机提交信息的准惯例)
谢谢~是的,使用getchar()
清除输入缓冲区绝对没有问题。
我认为这是清除输入缓冲区的最佳方法,而不是使用fflush
,%*c
或任何其他方法
“\n”
仅表示输入键(ascii值-10)
因此,while循环将一直运行,直到遇到\n
输入缓冲区将包含:
abcdefg 12 3 , . f\n
这回答了你的问题吗?它将清除stdin
中的剩余行。如果scanf
成功与否,它将起作用。下一个scanf
将扫描新行。@S.Cramer No,因为,
之后留下的任何东西都会保留下来。在正常情况下,换行后将什么都不会留下。但是,我认为您关于%c
之前的空格的评论是非常相关的。通过执行scanf(“%c%*[^\n]\n”,&code)可以避免整个while
循环
改为“这是正确的想法吗?”-->是的,但请注意,如果stdin
关闭,while(getchar()!='\n')代码>永不放弃。最好同时查找EOF
。函数:fflush()
仅用于输出流,stdin
是输入流。在输入流上使用fflush()