【发布时间】:2018-11-05 09:42:08
【问题描述】:
在输入无效的情况下保护程序的问题与编程一样古老,我在这个网站上发现了很多关于此的问题,但对我的情况没有任何帮助。
我有一个函数可以将值加载到浮点二维数组中。
void load_val(
float matrix[MAX_SIZE][MAX_SIZE],
const int line_num,
const int column_num
)
{
for (int i=0; i<line_num; ++i)
{
printf("Give number\n");
for (int j=0; j<column_num; ++j)
{
scanf("%f", &matrix[i][j]);
}
}
}
显然,当用户输入一个字母时,程序会进入一个无限循环。
我对这个问题使用了两种解决方案,但都没有奏效。
第一个是使用 scanf 在输入无效时返回 0 的事实。
所以不是
scanf("%f", &matrix[i][j]);
我写的
while (scanf("%f", &matrix[i][j])==1);
但它仍然给我一个无限循环。
另一种解决方案只是使用"isdigit" 函数。
int h = scanf("%f", &matrix[i][j]);
if (isdigit(h)==0)
{
puts("INVALID");
j--;
}
但我真的不想使用其他库,它也不起作用。 问题似乎是,在我检查输入是否有效之前,程序就因为输入而发疯了。
我什至试过这个
float h;
if (scanf("%f", &h)==1)
{
matrix[i][j]=h;
}
else
{
puts("INVALID");
j--;
};
仍然 - 无限循环。
如何在程序发疯之前检查此loop-inside-a-loop 中的无效输入?可能是浮点类型的问题吗?
【问题讨论】:
-
使用
fgets获取字符串中的输入。然后解析字符串以检查浮点数。如果你得到一个不需要的字符,你可以跳过它,或者警告用户。 -
在不相关的说明中,您对
isdigit的使用可能是错误的。特别是因为您似乎知道scanf返回什么。它也是一个标准的 C 函数,因此不会使用“其他库”。