显然我不会在这里发布我的全部代码,因为它很长,毕竟它是一个税务计算器。此问题适用于我的所有需要双值作为用户输入的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);
}
答案 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
这样的合适的最大值。