Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
紧跟在scanf之后的while循环中的getchar()_C_Input - Fatal编程技术网

紧跟在scanf之后的while循环中的getchar()

紧跟在scanf之后的while循环中的getchar(),c,input,C,Input,在堆栈溢出问题上有几个问题,综合起来,可能会回答这个问题。然而,我只是想毫无疑问地确保下面对代码段的解释是正确的 在“C编程:一种现代方法”中,偶尔会看到以下代码习惯用法,其中涉及scanf()函数和getchar()函数。考虑下面的例子,取自第392页: int main(void) { char code; for (;;) { printf("Enter operation code: "); scanf(" %c", &am

在堆栈溢出问题上有几个问题,综合起来,可能会回答这个问题。然而,我只是想毫无疑问地确保下面对代码段的解释是正确的

在“C编程:一种现代方法”中,偶尔会看到以下代码习惯用法,其中涉及
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()