【问题标题】:Scanf Confusion扫描混乱
【发布时间】:2015-03-31 13:16:24
【问题描述】:

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

【问题讨论】:

  • @Ayushi Jha 如果您要编辑其他人的帖子,请出于正当理由进行。切换到/从美式/英式英语不是编辑帖子的理由,任何一种形式都可以。请参阅what you should have edited

标签: c scanf


【解决方案1】:

'\n' 是一个空格字符。

scanf() 格式字符串中有空白字符时,它会导致scanf() 忽略任何空白字符,直到遇到非空白字符(除非该空白位于"%[]" 格式说明符中,如chux 在 cmets 中注明)。

因此,对于您描述的输入,scanf() 会忽略字符(其中没有字符),直到第一个 '2'。第二个scanf() 调用读取第二个整数,然后尝试忽略空格。所以它吃回车,然后继续前进,直到遇到一些非空白字符(您输入的第三个值的第一个数字)。然后它会一直等到再次按下回车键(顺便说一句,这意味着删除您输入的第三个值的后续数字)。

这就是正在发生的事情,或多或少会导致您看到的行为。

没有“移动光标”。 scanf() 解释输入的字符,它不执行任何输出。将光标移动到下一行是输出操作(或操作集)的结果,而不是输入操作的结果。格式字符串中的\n 告诉scanf() 如何解释和处理它接收到的输入,而它告诉printf() 输出一个换行符。这些是非常不同的操作。

要纠正该问题,从格式字符串中删除 '\n' 字符可能是最简单的方法,因为它们不会导致您(可能)期望的行为。

【讨论】:

  • 所以 \n 对于 printf 和 scanf 的处理方式不同,因为 printf 会将光标移动到下一行 rt..?
  • scanf() 解释输入的字符。它根本不执行输出。将光标移动到下一行是输出操作(或操作集)的结果,而不是输入操作的结果。格式字符串中的 \n 告诉 scanf() 如何解释和处理它接收到的输入。格式字符串中的 \n 告诉 printf() 输出换行符。这些是非常不同的操作。
  • “当 scanf() 中有空格字符时...忽略 ... 任何空格 ...”为真,除非 char"%[]" 说明符内。
  • 没错,chux。我更新了帖子以包含,并扩展了 scanf() 和 printf() 在处理格式字符串方面的区别。
【解决方案2】:

第一个scanf() 将光标移动到下一行,然后在第二个scanf() 中进行输入

不一定是这样:第一个scanf 中的\n 取出数字前面的任何空白,而不仅仅是\n。空格字符 和TAB \t 也会发生同样的情况。请注意,该行为不同于 printf,后者按照指示打印空白字符。

另外请注意,scanfs 中的\n 是不必要的,因为%d 无论如何都会丢弃数字前面的所有空格。

为什么它提示我在下一行输入另一个整数,而不是显示在下一行输入的消息 n

提示由printf\nscanf 的控制之外回显后完成。输入int 时,首先输入数字,然后按Enter。所有这些输入连同\n 字符一起发送回控制台进行打印。这就是导致第二个提示出现在下一行的原因。

【讨论】:

    【解决方案3】:

    scanf 中的\n 是错误的。除非您有另一个字段,例如 scanf( "%d\n%d", &amp;a, &amp;b )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2012-02-06
      • 2010-12-04
      • 2011-05-05
      相关资源
      最近更新 更多