Проблема защиты программы в случае неправильного ввода такая же старая, как программирование, и я нашел много вопросов по этому поводу на этом сайте, однако в моем случае мне ничего не помогло.
У меня есть функция, которая загружает значения в двумерный массив с плавающей точкой.
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?