繁体   English   中英

Scanf混乱

[英]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

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

scanf()格式字符串中有空白字符时,它会导致scanf()忽略任何空白字符,直到遇到非空格字符(除非该空格是"%[]"格式说明符,如上所述由chux在评论中)。

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

正是这种情况或多或少地导致了你所看到的行为。

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

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

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

不一定是这样: \\n在第一scanf取出的数目,不仅前述任何whitepsace \\n 对于空格角色也会发生同样的事情 和TAB \\t 请注意,行为与printf不同,后者按照指示打印空白字符。

另请注意,两个scanf中的\\n都是不必要的,因为%d会丢弃该数字前面的所有空格。

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

\\n scan在scanf的控制之外回显后, printf完成提示。 输入int ,首先输入数字,然后按Enter键 所有这些输入都将被发送回控制台以进行打印,以及\\n字符。 这就是导致第二个提示出现在下一行的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM