您可以在以下代码中解释一件事:
#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);
答案 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
现在可以读取n
和ch
两者的值,因此它们似乎都是
scanf
在printf("d-%d \n",n);
printf("ch-%d \n",ch);
的两次调用之后执行(事实并非如此!)。
答案 1 :(得分:2)
scanf
格式的任何空格都与scanf
格式的任何其他空格一样。它只是告诉scanf
跳过输入中的任何空格。
大多数格式代码不需要它,因为它们会自动跳过前导空格,但是(除非您想要实际读取空白字符)是"%c"
格式代码。
您可能还想阅读this reference。