c - C语言中scanf处 "%d"和 "%d "的区别

标签 c scanf whitespace format-specifiers format-string

如果我像下面这样编码

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”进行了小改动

为什么会发生这种情况?

最佳答案

Difference between “%d” and “%d ” at scanf in C language

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

而当您仅在格式说明符后使用不带空格的“%d”时,空格字符(例如换行符\n)会破坏使用。

<小时/>

It didn't keep going like before with small change with "%d "

Why does this happen?

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

3 未打印,因为 scanf() 仍在消耗。在这种特定情况下,只有输入另一个字符(例如 4),整个程序才会完成。这是可行的,因为 for 循环只有 3 个循环体。如果它有超过这个甚至不起作用。您需要在 stdin 中多一个字符,因为您已经演练了此类程序的 for 循环。

关于c - C语言中scanf处 "%d"和 "%d "的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856844/

相关文章:

c - 嵌入式 C 中的类型转换

c - 如何使用 fscanf 将大量输入从文件中提取到结构中。美标 C89(90)

c - 从文件中读取带空格的固定大小寄存器

objective-c - 如何使用Objective-C按空格分隔字符串?

c - for循环条件总是为真

c - scanf 指针段错误

c - scanf 多个变量

c# - 如何从 XML 文件中删除空格

string - Grails 字符串替换不起作用?

c - 迷宫的结构错误