1

我只是在学习用 C 编程,对 and 发生的事情有点scanf困惑getchar。我知道使用类似的东西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;
}

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

但是,使用 String 的格式时,"%d\n"我遇到了意外的行为。当用户输入一个整数并按回车键时,我希望打印“输入一个字符:”。相反,您可以继续按 Enter 键,直到您决定输入不同的字符之前什么都不会发生。因此,您可以输入“10”,按回车键 6 次,然后输入“d”并getchar()“正确”读取。整个程序输出看起来像这样

Enter an integer: 10




d
Enter a char: You entered integer: 10
You entered character: d

为什么我的程序在输入字符之前一直停止?printf我的第二个函数似乎在调用之后被调用,这似乎很奇怪getchar(因为在“输入字符:”被打印之前输入了读取的字符)。

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

4

3 回答 3

5

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

于 2013-10-30T19:19:54.173 回答
1

我不确定,但你可以尝试这样的事情:

printf("Enter an integer: ");
scanf("%d\n", &i);
fflush(stdin);
于 2013-10-30T19:22:17.837 回答
1

scanf docs (for linux) 说:

“一系列空白字符(空格、制表符、换行符等;参见 isspace(3))。该指令匹配输入中任意数量的空白,包括无空白。”

基本上 \n 不匹配逐字换行符,它匹配任意数量的空格,直到遇到非空格字符。

所以你scanf("%d\n", &i)吃掉了所有的空白,直到它看到一个非空白字符才返回。你会得到同样的效果 scanf("%d\t", &i)orscanf("%d ", &i)

于 2013-10-30T19:22:53.157 回答