我在下面的代码中观察到了scanf()的一些奇怪行为:
#include<stdio.h>
int main(void)
{
int n;
scanf("\n%d",&n); // 1 scanf
printf("N is entered=%d",n);
printf("\nAfter n being displayed\n");
scanf("%d\n",&n); // 2 scanf
prinf("n entered again =%d",n);
return 0;
}我对第二个scanf()的行为表示怀疑。第一个scanf()将光标移动到下一行,然后接受输入,而在第二个scanf()中,将游标移动到下一行,然后在那里等待,直到输入另一个整数。
为什么它提示我在下一行中输入另一个整数,而不是显示在下一行中输入的消息n,即使它的值为n?以下是产出:
2
N is entered=2
After n being displayed
45
543
n entered again=45发布于 2015-03-31 13:28:48
'\n'是一个空白字符。
当scanf()格式字符串中有空白字符时,它会导致scanf()忽略任何空白字符,直到遇到非空白字符为止(除非该空格位于"%[]"格式说明符中,如chux在注释中所指出的那样)。
因此,对于您描述的输入,scanf()在第一个'2'之前忽略字符(其中没有字符)。第二个scanf()调用读取第二个整数,然后尝试忽略空格。因此,它会吃掉回车,然后继续前进,直到遇到一些非空白字符(输入的第三个值的第一个数字)。然后,它等待到enter键再次被击中(顺便说一句,这意味着删除您输入的第三个值的后续数字)。
这就是正在发生的,或多或少,导致你所看到的行为。
没有“移动的光标”。scanf()解释输入的字符,不执行任何输出。将光标移动到下一行是输出操作(或操作集)的结果,而不是输入操作的结果。格式字符串中的\n告诉scanf()如何解释和处理它接收的输入,而它告诉printf()输出换行符。这是非常不同的行动。
为了纠正这个问题,从您的格式字符串中删除'\n'字符可能是最简单的,因为它们不会导致您(想必)所期望的行为。
发布于 2015-03-31 13:30:15
\n in scanf是错误的。除非你有另外一个像scanf( "%d\n%d", &a, &b )这样的字段。
https://stackoverflow.com/questions/29369627
复制相似问题