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

时间:2014-01-05 19:39:36

标签: 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;
}

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

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

2 个答案:

答案 0 :(得分:5)

实际输入后,

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

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

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

现在跳过空格是什么意思?

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

现在回答你的问题。

  

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

我假设printf()的输入为n。按 Enter 键时,15字符在输入缓冲区中与\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); 的两次调用之后执行(事实并非如此!)。

答案 1 :(得分:2)

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

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

您可能还想阅读this reference