在无效输入的情况下保护程序的问题与编程一样古老,我在这个网站上发现了很多关于这个的问题,但是对我来说没有任何帮助。
我有一个函数可以将值加载到浮点二维数组中。
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
中的无效输入?。可能是 float 类型的问题?
最佳答案
问题是,当您提供无效输入时,scanf
不会将其从输入缓冲区中移除。每次您在循环中调用 scanf
时,它都会一遍又一遍地读取相同的输入。
因此通常建议您使用fgets
读取整行,然后使用 sscanf
解析该行。
并检查scanf
(或sscanf
)returns 是检查是否成功的正确方法。
关于c - 防止循环中的无效数组输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53151791/