为什么我的第二个printf在预期时没有被调用?

Def*_*ult 1 c input scanf getchar

我刚学用C编程和感到有点困惑的东西去与scanfgetchar.我知道使用类似的东西scanf("%d", &i)会读取整数输入,但在输入缓冲区中保留以下换行符(这就是为什么必须getchar() == '\n'通过getcharscanf调用之后使用之前查找来清除输入缓冲区的原因.

这是我的简单(不正确)程序,它读取整数,然后是字符输入,并将它们打印回给用户:

int main(void)
{
    int i;
    printf("Enter an integer: ");
    scanf("%d\n", &i);

    printf("Enter a char: ");
    char ch = getchar();

    printf("You entered integer: %d\nYou entered character: %c\n", i, ch);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我将换行符留在我的scanf格式字符串中(所以只有"%d"),有意义的是,只要用户输入一个整数并点击输入,该整数将被读取并存储i,程序将继续执行( "输入一个字符:"立即打印,并ch存储换行符.

但是,使用格式String "%d\n"我会遇到意外行为.当用户输入一个整数并按Enter键时,我希望打印"输入字符:".相反,你可以继续按Enter键,直到你决定输入一个不同的角色时才会发生任何事情.所以你可以输入"10",输入6次,然后键入"d"并getchar()读取"正确".整个程序输出看起来像这样

Enter an integer: 10




d
Enter a char: You entered integer: 10
You entered character: d
Run Code Online (Sandbox Code Playgroud)

为什么我的程序在输入字符之前会停止?似乎奇怪的是,我的第二个printf函数似乎是在调用之后调用的getchar(因为在"输入字符:"之前输入了字符读取).

任何帮助将不胜感激.我只是想在C中进一步理解这种细微差别.

Mik*_*our 5

scanf格式字符串中,任何空白字符序列都将匹配输入中的任何数量的空白区域.因此,您\n将匹配任意数量的新行,并且scanf只有在遇到非空格字符时才会返回.