我有以下代码要求用户输入(lowWarp)。输入必须是1.0到10.0。如果我输入,比方说,0.2,它允许我尝试输入另一个值。但是,如果我输入1/2或asdf之类的东西,它会开始无休止地循环。如何防止这种情况,而是允许输入正确的值?
while (badData == true)
{
printf("Enter the low warp factor; warp factor = \n");
scanf_s("%f", &lowWarp);
if (lowWarp < 1.0 || lowWarp > 10.0) //Determines if number is between 1.0 - 10.0
{
badData = true;
printf("Invalid input! Range is 1.0 - 10.0.\n");
lowWarp = 0.0;
}
else
{
badData = false;
}
}
答案 0 :(得分:1)
scanf()
不会丢弃无效输入。因此,它一次又一次地读取并导致无限循环。
您可以使用fgets()
阅读行并使用sscanf()
进行解析:
char line[1024];
float lowWarp;
fgets(line, sizeof line, stdin);
if(sscanf(line, "%f", &lowWarp) != 1) {
/* invalid */
}
答案 1 :(得分:0)
您可以使用函数isdigit()。如果您这样做,请查看返回值并将其用于检查。
答案 2 :(得分:0)
scanf_s("%f", &lowWarp);
不会消耗错误输入,因为它会重复查找有效的数字输入。结果:输入"asdf"
并再次调用scanf_s()
时无限循环。
作为处理用户可能输入的邪恶事物的好代码需要进行多次测试,也可以做一个辅助函数。
// 0:success or EOF
int Read_float(const char *prompt, float *dest, float min, float max) {
for (;;) {
char buf[100];
fputs(prompt, stdout);
fflush(stdout);
if (fgets(buf, sizeof buf, stdin) == NULL) {
return EOF;
}
char *endptr;
double y = strtod(buf, &endptr);
if (buf == endptr || *endptr != '\n') {
continue; // only \n entered or invalid `chars` entered
}
if (y >= min && y <= max) {
*dest = (float) y;
return 0; // success
}
}
}
float lowWarp;
if (Read_float("Enter the low warp factor; warp factor = \n",
&lowWarp, 1.0f, 10.0f) == EOF) {
Handle_EOF();
}
float highWarp;
if (Read_float("Enter the high warp factor; warp factor = \n",
&highWarp, 10.0f, 100.0f) == EOF) {
Handle_EOF();
}