我在下面的代码中观察到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 displayedn");
scanf("%dn",&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
'n'
是一个空白字符。
当scanf()
格式字符串中有空白字符时,它会导致scanf()
忽略任何空白字符,直到遇到非空白字符(除非该空白位于"%[]"
格式说明符中,如注释中的chux所示)。
因此,对于您描述的输入,scanf()
忽略字符(其中没有),直到第一个'2'
。第二个scanf()
调用读取第二个整数,然后尝试忽略空白。因此,它吃掉回车,然后继续,直到遇到一些非空白字符(您输入的第三个值的第一位)。然后它会等待,直到再次按下回车键(顺便说一下,这意味着删除您输入的第三个值的后续数字)。
这或多或少是造成你所看到的行为的原因。
不存在"移动光标"。scanf()
解释输入的字符,并且不执行任何输出。将光标移动到下一行是输出操作(或一组操作)的结果,而不是输入操作的结果。格式字符串中的n
告诉scanf()
如何解释和处理它接收的输入,而它告诉printf()
输出新行。这些都是非常不同的操作。
为了纠正这个问题,从格式字符串中删除'n'
字符可能是最简单的,因为它们不会导致您(可能)期望的行为。
第一个
scanf()
将光标移动到下一行,然后在第二个scanf()
中输入
不一定是这样:第一个scanf
中的n
取出该数字之前的任何空白,而不仅仅是n
。对于空格字符和TAB
printf
也会发生同样的情况。请注意,该行为与n
不同,后者按照指示打印空白字符。
还要注意,两个%d
中的scanf
都是不必要的,因为printf
无论如何都会丢弃数字之前的所有空白。
为什么它会提示我在下一行中输入另一个整数,而不是显示在的下一行输入的消息n
CCD_ 28在CCD_ 29的控制之外得到响应之后,由CCD_ 27进行提示。输入n
时,先输入数字,然后按enter。所有这些输入与n
字符一起发送回控制台进行打印。这就是导致第二个提示出现在下一行的原因。
scanf( "%dn%d", &a, &b )
中的scanf
错误。除非您有另一个类似CCD_34的字段。