关于字符:C如何处理scanf中的尾随空格?

How does C treat trailing spaces in scanf?

如果scanf语句在格式字符串中有任何空格,如下所示:

1
scanf(" %c",&abc);

然后它跳过无限多的空格,直到碰到一个字符。因此 p作为输入将p存储在abc中。

使用这个概念,我无法预测我输入的以下程序的输出。

1
2
3
4
5
6
7
char echo ;
do {
       scanf ("%c", &echo);
       printf ("%c
"
,echo);
} while (echo != '
'
) ;

注意scanf语句中有一个尾随空格。

代码执行后,我得到以下行为。它要求一个角色。我输入c它要求一个角色。我输入i它打印C。它要求一个角色。我输入r它打印了我。它要求一个角色。我输入c它打印R。

这会一直持续下去。如果我按newline,它就会跳过它。为什么开头要求两个字符?它不应该执行printf语句吗?为什么前一个输入的字符会在下一个输入中打印?


scanf格式中,空格字符与输入中任何数量的空白(空格、制表符和换行符)匹配。

所以你进入C + newline,什么也没有发生,因为scanfC%c匹配,newline被空间吞噬。但是scanf会一直持续到它得到不匹配的东西为止。所以您可以在这里放置任意数量的空格、制表符和换行符。

scanf读到不匹配的东西时,它调用ungetc(c, stdin)把它放回stdin并返回。所以空间将继续匹配,直到放置不同的内容。

这就是当您键入R + newline时,最后一个scanf返回的原因。然后执行下一个scanf,它将R%c匹配,将换行符与空格匹配。但是空间仍然匹配任何数字的空白。它将在键入非空白字符时结束。