Проверка входных данных C ++ cin в цикле while - PullRequest
1 голос
/ 29 апреля 2020

Мой код в основном работает, за исключением одной незначительной проблемы. Хотя он должен принимать только целые числа, он также принимает пользовательский ввод, начинающийся с int, например, 6abc. Я видел исправление для этого здесь , но оно изменило тип ввода на строку и добавило намного больше строк кода. Мне интересно, есть ли более простой способ исправить это:

int ID;
cout << "Student ID: ";
// error check for integer IDs
while( !( cin >> ID )) {
    cout << "Must input an integer ID." << endl ;
    cin.clear() ; 
    cin.ignore( 123, '\n' ) ; 
}

1 Ответ

0 голосов
/ 29 апреля 2020

Одним словом - нет.

Но вместо этого вы можете сначала прочитать целое слово в std::string, а затем преобразовать все это слово в int, проверяя ошибки в этом. преобразование, например:

int ID;
string input;

do
{
    cout << "Student ID: ";
    if (!(cin >> input))
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    else
    {
        size_t pos = 0;
        try
        {
            ID = stoi(input, &pos);
            if (pos == input.size())
                break;
        }
        catch (const std::exception &) {}
    }
    cout << "Must input an integer ID." << endl;
}
while (true);

Live Demo

...