假设我使用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
。为什么会这样?
答案 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?