Используйте функцию std::getline
для чтения всей строки.Затем используйте стандартную библиотеку C strtol
, чтобы убедиться, что пользователь ввел действительное целое число.Он устанавливает errno
в ненулевое значение, чтобы указать переполнение, и *endptr
в первый экземпляр недопустимого символа, если недопустимый символ существует.Если какой-либо из этих индикаторов установлен, мы повторно запускаем цикл do
, заставляя пользователя повторно вводить число, пока данные не будут действительными
std::string line;
char *endptr;
long n;
do {
std::cout << "Enter integer >= 0\n";
std::getline(std::cin, line);
n = strtol(line.c_str(), &endptr, 10);
} while ((errno != 0 && n == 0) || endptr == line.c_str() || *endptr != '\n' || n < 0);
// at this point, n is valid