检查读取char对Enter键时的getchar问题

时间:2014-11-17 17:18:40

标签: c getchar

我有一个简单的c代码如下:

#define RECORDS_PER_PAGE 24

int main(void) {
    int i = 0, n;
    char pause_char;

    printf("Enter a number as the stop point: ");
    scanf("%d", &n);

    while (++i <= n) {
        printf("i is: %d\n", i);
        if (i % RECORDS_PER_PAGE == 0) {
            printf("Press Enter to continue...");
            while((pause_char = getchar()) != '\n');
        }
    }
    return 0;
}

问题是当我输入30作为停止点时,我得到以下输出:

我是:1 我是:2
我是:3
...
我是:24
按Enter继续...我是:25
...
我是:30

我希望程序在if条件满足时停止。但它继续没有注意到getchar。但奇怪的是,当我输入例如60作为停止点时,它将给出以下输出:

我是:1 我是:2
我是:3
...
我是:24
(1)按Enter继续...我是:25
...
我是:30
...
我是:46
我是:47
我是:48
(2)按Enter继续...
我是:49
...
我是:59
我是:60

它将停在(2)但不停止(1)。我现在可能缓冲区中的某些东西导致了这个问题,但我不明白为什么。有没有解释呢?

1 个答案:

答案 0 :(得分:1)

问题在于,当您阅读输入时,您可以按ENTER键结束输入,从而为您提供您的号码和\n,例如30\n

因此,您的scanf会读出该号码并在\n缓冲区中留下stdin, 然后getchar()出现并读取一个字节\n

简单但难看的解决方案,添加另一个getchar()以宣读\n。 (更好的方法是直接在scanf阅读中处理它。)