Сейчас я использую эту функцию для ввода пользователя.
int getOnlyNumber(int num)
{
while (!(cin >> num)) {
// Reset the input:
cin.clear();
// Get rid of the bad input before return was pressed:
while (cin.get() != '\n')
{
continue;
}
// Ask user to try again:
cout << "Please enter a number: ";
}
return num;
}
Похоже, что это только ломает плохой ввод, если сначала вводится буква. Если сначала вводится номер, программа принимает его. Ex. он примет 1e, но поймает e1. Это используется следующим образом:
displayChoice = getOnlyNumber(displayChoice);
Где displayChoice является int. Что мне нужно изменить, чтобы поймать 1е как вход или любой другой ввод, который начинается с числа, но имеет строки?
Если вы дадите ему частичное число, то по умолчанию оно делает все возможное и дает вам биты, которые ему удалось понять.
Если вы хотите увидеть, была ли ошибка во время преобразования, вам нужно проверить cin.fail().
while (!(cin >> num) || cin.get()!='\n') {
...
Вы можете использовать std::all_of
чтобы проверить, является ли целая строка числом:
std::string str;
auto is_digit_check = [] (unsigned char c) { return std::isdigit(c); };
while (!(std::cin >> str) ||
!std::all_of(str.begin(), str.end(), is_digit_check))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return std::stoi(str);