Проверка на ввод целого числа
У меня есть функция, в которой я проверяю ввод пользователя. Реализовал эту проверку через цикл do-while. Логику условно можно поделить на 2 части. В первой части я проверяю, является ли число, которое вводит пользователь - целым (int), во второй - проверяю, подходит ли мне вообще это целое число.
Вторая часть работает: если ввести целое число, которое мне не подходит, то там выводится сообщение об ошибке и предлагается ввести число ещё раз.
При вводе же не целого числа происходит вакханалия, которая на скрине.
В чем может быть проблема?
Полный код функции:
int gameboardSize(void) {
int size;
bool status(false); // для проверки на ввод "нормального" размера поля, желания продолжить игру
do {
cout << "Введите размер игрового поля (3 - 9) -->> ";
if (std::cin >> size) {}
else {
cout << "Введите число от 3 до 9 -->> ";
}
if (size > 2 && size < 10 && size > 0) {
status = true;
}
else {
cout << "Вы ввели неправильный размер игрового поля. Попробуйте ещё раз.\n";
}
} while (status != true);
return size;
}
Ответы (2 шт):
Ну смотрите: вы ввели НЕ число. Значит, введенное не считано, осталось в потоке, выставлен флаг fail... Вы же опять требуете от него читать число. Он читает - то, что не прочел первый раз, опять сталкивается с той же проблемой (вернее, раз fail не сброшен, он и читать-то не будет), и все идет по кругу...
Я как-то, фрилансируя :), для студентов набросал такой способ чтения с обработкой ошибок, смотрите, может, пригодится :)
int inputInt(const char * prompt, int m = INT_MIN, int M = INT_MAX)
{
int N;
for (;;) {
std::cout << prompt << " (целое от " << m << " до " << M << "): " << std::flush;
if ((std::cin >> N).good() && (m <= N) && (N <= M)) return N;
if (std::cin.fail()) {
std::cin.clear();
std::cout << "Неверный ввод, повторите.\n";
} else {
std::cout << "Число вне допустимого диапазона значений. Повторите ввод.\n";
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
}
a = inputInt("Введите размер массива",1,10);
Но ведь данный код работает не совсем корректно. Если, допустим ввести "1.2", что является вещественным, а не целым числом, то функция вернёт 1, хотя, на мой взгляд, должна выдать ошибку и запросить повторный ввод числа.
