奇怪的scanf问题在C中

时间:2012-11-13 16:39:52

标签: c

假设我使用scanf来读取键盘上的字符。之后我使用printf打印我刚读过的角色。

scanf("%c",&ch);
printf("%c",ch);

scanf正在阅读该字符时,我必须按Enter继续并运行printf,对吧?

让我说我用键盘输入ABCD。之后printf将打印A

但是当我这样做时:

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

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

但不是这样,它会打印ABCD。为什么会这样?

3 个答案:

答案 0 :(得分:7)

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

在打印'A'后,缓冲区中仍有"BCD\n",以便下一个scanf立即成功阅读另一个char,{{1}在循环的下一次迭代中。

答案 1 :(得分:4)

  

在scanf中我必须按回车继续并运行printf吗?

不。只要有一个要阅读的字符,就会被阅读。

  

我输入scanf ABCD后printf将打印A ...

如果您输入ABCD并输入,则输入现在将包含五个字符。 A,B,C,D和换行符。您的循环将按顺序读取字符A,B,C,D,然后读取换行符。

答案 2 :(得分:1)

scanf不等你按Enter键,如果它与你的格式字符串匹配,它会简单地尝试读取你键入的内容。如果您使用过%s,那么在匹配之前它会等到空白字符。

此主题也可能有用:why does scanf not wait for user input after it fails one time?