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

#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);

最佳答案

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

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

现在,跳过空格意味着什么?

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

现在来问你的问题。



我假设n的输入是15。当您按Enter键时,\n字符与15一起出现在输入缓冲区中。 scanf("%d\n",&n);读取15,然后跳过\n。现在,此scanf等待输入非空格字符(与您认为应打印15的情况不同)。输入a时,会将其放回去,以便下次调用scanf时使用。下一条语句scanf("\n%c",&ch);从缓冲区读取此a,并且不让用户输入ch的值。由于现在n读取了chscanf的值,因此似乎

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

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

10-06 07:33
查看更多