为什么在循环内部,带有%d的scanf()不会等待用户输入,以防它先前收到无效输入?

时间:2016-09-16 18:15:09

标签: c scanf stdin input-buffer

我正在使用scanf() returns when it gets what is expects or when it doesn't. What happens is it gets stuck in the while()`loop。

据我所知test = scanf("%d", &testNum);如果收到一个数字则返回1,如果没有则返回0.

我的代码:

#include<stdio.h>

int main(void) {
    while (1) {
        int testNum = 0;
        int test;
        printf("enter input");
        test = scanf("%d", &testNum);
        printf("%d", test);
        if (test == 0) {
            printf("please enter a number");
            testNum = 0;
        }
        else {
            printf("%d", testNum);
        }
    }
    return(0);
}

1 个答案:

答案 0 :(得分:1)

这里的问题是,遇到无效的输入(例如,一个字符),错误的输入不是消耗,它仍然在输入缓冲区中。

因此,在下一个循环中,scanf()再次读取相同的无效输入。

您需要在识别错误​​输入后清理缓冲区。 简单的方法将是

    if (test == 0) {
        printf("please enter a number");
        while (getchar() != '\n');  // clear the input buffer off invalid input
        testNum = 0;
    }

也就是说,初始化test或删除printf("%d", test);,因为test是一个自动变量,除非明确初始化,否则包含不确定的值。尝试使用它可以调用undefined behavior

那说,只是为了挑剔return不是一个功能,不要让它看起来像一个。这是一个很好的结果,所以return 0;对眼睛来说更舒缓,更不用说混乱了。