C:如果用户使用fflush(stdin)输入一个字符,程序将不再询问用户

时间:2015-11-21 16:58:36

标签: c scanf fflush

显然我不会在这里发布我的全部代码,因为它很长,毕竟它是一个税务计算器。此问题适用于我的所有需要​​双值作为用户输入的scanfs。基本上如标题所示,我的程序不会要求用户输入另一个值,即使它是一个字符,这显然不是一个双重值,所以一些帮助将非常感激。请原谅我,因为我还在课程的第一年,并且对编程一无所知。

double salary;
printf("This program will compute your yearly and monthly witholding tax for you \n");
printf("How much is your total monthly salary? ");
fflush(stdin);
scanf("%lf", &salary);
while (salary < 0)
{
    printf("\n");
    printf("Invalid Input\n");
    printf("How much is your total monthly salary? ");
    fflush(stdin);
    scanf("%lf", &salary);
}

1 个答案:

答案 0 :(得分:3)

您正确诊断了问题:无效输入保留在输入缓冲区中,导致后续scanf失败。您无法使用fflush更正此问题,因为它未针对输入流进行定义。请注意,您也滥用scanf,因为您没有测试返回值。

对您的问题的简单和通用解决方案是:用对函数的调用替换对scanf的调用,该函数从用户读取一行并重复地将其解析为字符串,直到输入EOF或正确的输入。

此功能需要一个有效性检查范围。如果你不想接受所有输入,你可以通过无穷大。

int getvalue(const char *prompt, double *vp, double low, double high) {
    char buffer[128];
    for (;;) {
        printf("%s ", prompt);
        if (!fgets(buffer, sizeof buffer, stdin)) {
            printf("EOF reached, aborting\n");
            // you can also return -1 and have the caller take appropriate action
            exit(1);
        }
        if (sscanf(buffer, "%lf", vp) == 1 && *vp >= low && *vp <= high)
            return 0;
        printf("invalid input\n");
    }
}

在您的代码片段中,您将使用以下内容替换所有内容:

double salary;
printf("This program will compute your yearly and monthly withholding tax for you\n");
getvalue("How much is your total monthly salary?", &salary, 0.0, HUGE_VAL);

HUGE_VAL<math.h>中定义,但无论如何,它的值似乎有点高,你可以写出一个像1E9这样的合适的最大值。