Прием только чисел в пользовательском вводе c ++

0

Сейчас я использую эту функцию для ввода пользователя.

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е как вход или любой другой ввод, который начинается с числа, но имеет строки?

  • 0
    Какой у Вас вопрос ?
  • 0
    Что я могу добавить, чтобы поймать такие вещи, как 1e в качестве входа. Прямо сейчас это не ловит это.
Теги:

2 ответа

0
Лучший ответ

Если вы дадите ему частичное число, то по умолчанию оно делает все возможное и дает вам биты, которые ему удалось понять.

Если вы хотите увидеть, была ли ошибка во время преобразования, вам нужно проверить cin.fail().

    while (!(cin >> num) || cin.get()!='\n') {
    ...
  • 0
    Он по-прежнему не перехватывает ввод, начинающийся с цифр, и имеет буквы типа 4ffsd или 2ddd22.
  • 0
    Подробнее об этом (я никогда не использую стандартные потоки), и это не ошибка, потому что поток прекращает обработку, когда достигает недопустимого символа. Вы можете сказать, что произошла ошибка, если вызов cin.get () возвращает что-либо кроме '\ n'. Изменено соответственно.
0

Вы можете использовать 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);
  • 0
    Так что я должен принять входные данные в виде строки и преобразовать это в int на входе хорошо? Это лучший способ сделать это?
  • 0
    @Hulu Вы также можете использовать регулярные выражения для поиска правильного шаблона, но да, это лучший способ сделать это для этого простого примера. Для более сложных паттернов регулярные выражения кажутся лучшим решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню