扫描混淆
Scanf Confusion
我在下面的代码中观察到 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
The first scanf()
is moving the cursor to the next line and then takes the input while in the second scanf()
不一定如此:第一个 scanf
中的 \n
会去掉数字前面的任何空白,而不仅仅是 \n
。 space 字符 </code> 和 TAB <code>\t
也会发生同样的事情。请注意,该行为不同于 printf
,它按照指示打印白色 space 个字符。
还要注意 scanf
中的 \n
是不必要的,因为 %d
无论如何都会丢弃数字前面的所有白色 space。
Why it prompts me to input another integer in the next line rather than displaying the message n entered in the very next line
在 \n
在 scanf
的控制之外回显后,printf
完成提示。输入 int
时,先输入数字,然后按 Enter。所有这些输入连同 \n
字符一起发送回控制台进行打印。这就是导致第二个提示出现在下一行的原因。
'\n'
是一个空白字符。
当 scanf()
格式字符串中有空白字符时,它会导致 scanf()
忽略任何空白字符,直到遇到非空白字符(除非该空白位于 "%[]"
格式说明符,如 chux 在评论中指出的那样)。
因此,对于您描述的输入,scanf()
会忽略第一个 '2'
之前的字符(其中有 none)。第二个 scanf()
调用读取第二个整数,然后尝试忽略空格。所以它吃回车 return,然后继续前进直到遇到一些非空白字符(您输入的第三个值的第一个数字)。然后等待直到再次按下回车键(顺便说一下,这意味着删除您输入的第三个值的后续数字)。
这或多或少就是导致您看到的行为的原因。
没有"moving of the cursor"。 scanf()
解释输入的字符,但不执行任何输出。将光标移动到下一行是输出操作(或一组操作)的结果,而不是输入操作的结果。格式字符串中的 \n
告诉 scanf()
如何解释和处理它接收到的输入,而它告诉 printf()
输出换行符。这些是非常不同的操作。
要解决此问题,最简单的方法可能是从格式字符串中删除 '\n'
个字符,因为它们不会导致您(大概)期望的行为。
scanf
中的\n
是错误的。除非你有另一个字段,比如 scanf( "%d\n%d", &a, &b )
.
我在下面的代码中观察到 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
The first
scanf()
is moving the cursor to the next line and then takes the input while in the secondscanf()
不一定如此:第一个 scanf
中的 \n
会去掉数字前面的任何空白,而不仅仅是 \n
。 space 字符 </code> 和 TAB <code>\t
也会发生同样的事情。请注意,该行为不同于 printf
,它按照指示打印白色 space 个字符。
还要注意 scanf
中的 \n
是不必要的,因为 %d
无论如何都会丢弃数字前面的所有白色 space。
Why it prompts me to input another integer in the next line rather than displaying the message n entered in the very next line
在 \n
在 scanf
的控制之外回显后,printf
完成提示。输入 int
时,先输入数字,然后按 Enter。所有这些输入连同 \n
字符一起发送回控制台进行打印。这就是导致第二个提示出现在下一行的原因。
'\n'
是一个空白字符。
当 scanf()
格式字符串中有空白字符时,它会导致 scanf()
忽略任何空白字符,直到遇到非空白字符(除非该空白位于 "%[]"
格式说明符,如 chux 在评论中指出的那样)。
因此,对于您描述的输入,scanf()
会忽略第一个 '2'
之前的字符(其中有 none)。第二个 scanf()
调用读取第二个整数,然后尝试忽略空格。所以它吃回车 return,然后继续前进直到遇到一些非空白字符(您输入的第三个值的第一个数字)。然后等待直到再次按下回车键(顺便说一下,这意味着删除您输入的第三个值的后续数字)。
这或多或少就是导致您看到的行为的原因。
没有"moving of the cursor"。 scanf()
解释输入的字符,但不执行任何输出。将光标移动到下一行是输出操作(或一组操作)的结果,而不是输入操作的结果。格式字符串中的 \n
告诉 scanf()
如何解释和处理它接收到的输入,而它告诉 printf()
输出换行符。这些是非常不同的操作。
要解决此问题,最简单的方法可能是从格式字符串中删除 '\n'
个字符,因为它们不会导致您(大概)期望的行为。
scanf
中的\n
是错误的。除非你有另一个字段,比如 scanf( "%d\n%d", &a, &b )
.