奇怪的scanf问题在C中

use*_*300 0 c

比方说我用来scanf从键盘上读取一个字符.之后,我printf用来打印我刚读过的角色.

scanf("%c",&ch);
printf("%c",ch);
Run Code Online (Sandbox Code Playgroud)

scanf阅读角色的时候,我必须按回车继续并运行printf,对吧?

让我们说我ABCD用键盘进入.之后printf将打印A.

但是当我这样做时:

do {
   scanf("%c",&ch);
   printf("%c",ch);
} while (ch!='\n');
Run Code Online (Sandbox Code Playgroud)

并输入ABCD键盘,我认为printf必须打印A.因为A不是\n它会继续循环,对吗?

但不会这样,它会打印出来ABCD.为什么会这样?

Dan*_*her 7

键入时"ABCD\n",每个都从输入缓冲区中scanf("%c",&ch);读取一个char,直到到达换行符.

因此,在'A'打印之后,"BCD\n"缓冲区中仍然存在一个,以便下一次scanf立即成功读取另一个char,'B'在循环的下一次迭代中.