扫描混淆

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

\nscanf 的控制之外回显后,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 ).