【问题标题】:Difference between "%d" and "%d " at scanf in C language [duplicate]C语言中scanf中“%d”和“%d”之间的区别[重复]
【发布时间】:2020-01-22 09:52:22
【问题描述】:

如果我像下面这样编码

int main()
{
    int num;

    for(int i = 0; i < 3; i++)
    {
        printf("enter an integer\n");
        scanf("%d", &num);
        printf("%d\n", num);
    }
    return 0;
}

然后输入“1 2 3”,输出为

enter an integer
1 2 3
1
enter an integer
2
enter an integer
3

我知道这是因为缓冲区在输入时一次包含 1、2、3

但是,当我在 scanf 中从“%d”到“%d”添加空格并像以前一样输入相同的内容“1 2 3”时,

输出是

enter an integer
1 2 3
1
enter an integer
2
enter an integer

它并没有像以前那样继续使用“%d”进行小改动

为什么会这样?

【问题讨论】:

    标签: c scanf whitespace format-specifiers format-string


    【解决方案1】:

    C语言scanf中“%d”和“%d”的区别

    不同之处在于,当您使用“%d”作为格式字符串时,scanf()继续使用空白字符,直到遇到另一个非空白字符,例如 2,3,4。输入数字后的简单换行符\n 或另一个空格字符不会破坏消耗。

    而当您在格式说明符后仅使用不带空格的“%d”时,诸如换行符\n 之类的空格字符会中断使用。


    它并没有像以前那样继续使用“%d”进行小改动

    为什么会这样?

    原因是scanf("%d ", &amp;num); 在 for 循环的第三次演练中消耗了 3 之后,仍在消耗尾随空格直到找到另一个字符。 p>

    3 未打印,因为scanf()仍在消耗。整个程序只有在您输入另一个字符(如4)时才能完成,在这种特定情况下。这将起作用,因为 for 循环的主体只有 3 个演练。如果它有更多的东西甚至行不通。您需要在 stdin 中再添加一个字符,因为您已经对这种程序的 for 循环进行了演练。

    【讨论】:

    • "整个程序只有在你输入另一个字符时才能完成......" -- 使用 Ctrl-D (Linux) 或Ctrl-C (Windows) 也可以。
    • @exnihilo 确实如此;但这需要用户采取行动。如果用户不做任何事情或另一个程序在stdin 中写入字符,程序将不会从它自己的手中停止使用这个缓冲区。
    • 重点是scanf() 不会返回,直到匹配失败到达文件末尾。 “你需要多一个角色”不太对。如果输入是从文件重定向的,scanf() 将在到达文件末尾时返回。我对重复问题的回答讨论了这一点。
    • @exnihilo 在第三次调用scanf() 时,当 3 被消耗时,它会搜索另一个非白色字符。如果遇到一个,例如 4,它应该结束相应的消耗,scanf() 将返回,3 与下一个 printf() 一起打印,并且由于循环没有进一步的迭代,程序将完成。无论如何,我还没有在副本中看到你的答案和讨论。我现在去看看。
    • @exnihilo 好的,我已经读过了。 +1为您的答案。 - 我现在明白你的意思了 - 当它遇到文件结尾时,消费也将失败,并且 scanf() 返回EOF。是的,我忘记提了。我会将其纳入我的回答中。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2011-02-14
    • 2014-05-30
    • 1970-01-01
    • 2023-03-17
    • 2022-10-14
    相关资源
    最近更新 更多