为什么交错的scanf()+ printf()语句导致两个scanf()调用先执行,然后两个printf()调用?

您可以在以下代码中解释一件事:

#include int main() { int n;char ch,ch1; scanf("%d\n",&n); printf("d-%d \n",n); scanf("\n%c",&ch); printf("ch-%d \n",ch); scanf("\n%c",&ch1); printf("ch1-%d \n",ch1); printf("%d %d %d\n",n,ch,ch1); return 0; } 

为什么在输入n的值之后,它直接要求ch的值然后直接执行语句来打印它们各自的值,即语句:

 printf("d-%d \n",n); printf("ch-%d \n",ch); 

scanf("%d\n",&n); 实际输入后跳过任意数量的尾随空格(包括无)。 它也可以写成scanf("%d ",&n);

scanf("\n%c",&ch); 在实际输入之前跳过任意数量的前导空格(包括无)。 它也可以写成scanf(" %c",&ch);

注意:格式说明符中的空格可以跳过任意数量的空格。

现在跳过白色空间意味着什么?

这意味着scanf重复从输入读取空白字符,直到它到达非空白字符。 现在缓冲区中没有留下空白字符
当遇到非空格字符时,则在扫描下一个输入项目期间或在下一次调用scanf期间,将该字符放回以再次读取。

现在回答你的问题。

为什么交错的scanf() + printf()语句导致两个scanf()调用先执行,然后两个printf()调用?

我假设n的输入是15 。 按Enter键时, \n字符在输入缓冲区中以15结尾。 scanf("%d\n",&n); 读取15然后跳过\n 。 现在这个scanf等待输入一个非白色空格字符(不像你应该打印15那样)。 当你输入a ,它会将它放回到下一次scanf调用中。 下一个语句scanf("\n%c",&ch); 从缓冲区读取此a并且不允许用户输入ch的值。 由于nch的值现在都被这些scanf读取,因此它们似乎都是

 printf("d-%d \n",n); printf("ch-%d \n",ch); 

在两次scanf调用之后执行(事实并非如此!)。

scanf格式的任何空格都与scanf格式的任何其他空格一样。 它只是告诉scanf跳过输入中的任何空格。

大多数格式代码不需要它,因为它们会自动跳过前导空格,但是(除非您想要实际读取空白字符)是"%c"格式代码。

您可能还想阅读此参考 。