Проверка на ввод целого числа

У меня есть функция, в которой я проверяю ввод пользователя. Реализовал эту проверку через цикл 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 шт):

Автор решения: Harry

Ну смотрите: вы ввели НЕ число. Значит, введенное не считано, осталось в потоке, выставлен флаг 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);
→ Ссылка
Автор решения: M1sha1L

Но ведь данный код работает не совсем корректно. Если, допустим ввести "1.2", что является вещественным, а не целым числом, то функция вернёт 1, хотя, на мой взгляд, должна выдать ошибку и запросить повторный ввод числа.

→ Ссылка