This question already has an answer here:
using scanf(“%d ”) with a space after the %d
                                
                                    (1个答案)
                                
                        
                                23天前关闭。
            
                    
如果我像下面这样编码

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的“%d”和“%d”之间的差异


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

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




  用“%d”进行少量更改后,它并没有像以前那样继续前进
  
  为什么会这样?


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

不打印3,因为scanf()仍然很消耗。在这种情况下,只有输入其他字符(例如4),整个程序才会完成。这将起作用,因为for循环的主体仅有3个演练。如果它有更多的功能,那将甚至行不通。在使用此类程序进行for循环的演练时,您需要在stdin中再包含一个字符。

09-30 15:53