c-扫描混乱

  • 本文关键字:混乱 扫描 c scanf
  • 更新时间 :
  • 英文 :


我在下面的代码中观察到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的字段。

最新更新