为什么交错的scanf()+ printf()语句导致两个scanf()调用先执行,然后两个printf()调用?
您可以在以下代码中解释一件事:
#include 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
期间,将该字符放回以再次读取。
现在回答你的问题。
为什么交错的
scanf()
+printf()
语句导致两个scanf()
调用先执行,然后两个printf()
调用?
我假设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
调用之后执行(事实并非如此!)。
scanf
格式的任何空格都与scanf
格式的任何其他空格一样。 它只是告诉scanf
跳过输入中的任何空格。
大多数格式代码不需要它,因为它们会自动跳过前导空格,但是(除非您想要实际读取空白字符)是"%c"
格式代码。
您可能还想阅读此参考 。