您能否在以下代码中解释一件事:
#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
读取了ch
和scanf
的值,因此似乎
printf("d-%d \n",n);
printf("ch-%d \n",ch);
在两个
scanf
调用之后执行(事实并非如此!)。