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

aro*_*nav 2 c printf scanf

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

#include<stdio.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

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

printf("d-%d \n",n);
printf("ch-%d \n",ch);
Run Code Online (Sandbox Code Playgroud)

hac*_*cks 5

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

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

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

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

它意味着scanf从输入重复读取空白字符,直到它到达非空白字符.现在缓冲区中没有留下空白字符.
当它遇到一个非空格字符,则该字符被放回待下一个输入项的扫描过程中或下次调用时再次读取scanf.

现在回答你的问题.

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

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

printf("d-%d \n",n);
printf("ch-%d \n",ch);   
Run Code Online (Sandbox Code Playgroud)

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