首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

Scanf混淆
EN

Stack Overflow用户
提问于 2015-03-31 13:16:24
回答 2查看 1.3K关注 0票数 5

我在下面的代码中观察到了scanf()的一些奇怪行为:

代码语言:javascript
运行
复制
#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?以下是产出:

代码语言:javascript
运行
复制
2 
N is entered=2
After n being displayed
45
543
n entered again=45
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 13:28:48

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

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

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

这就是正在发生的,或多或少,导致你所看到的行为。

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

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

票数 9
EN

Stack Overflow用户

发布于 2015-03-31 13:30:15

\n in scanf是错误的。除非你有另外一个像scanf( "%d\n%d", &a, &b )这样的字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29369627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档