Comparing Sizes Ответов: 2

C++ как я могу поймать исключение, если кто-то вводит текст вместо числа?


Я пытаюсь заставить кого-то ввести число от -1 до 122. Я хочу использовать throw, catch и try, если кто-то вводит символ или строку вместо числа. Если это лучший способ сделать это?
#include <iostream>
using namespace std;

int main()
{
    int age;
    int x = 0;
    int y = 121;

    cout << "Enter you age: ";
    cin >> age;

    if (age >= x && age <= y)
    cout << "So your age is: " << age << ", that's believable";
    else
    cout << "Your age is " << age << "? Not Believable!";

    return 0;
}


Что я уже пробовал:

Я пытался играть с броском, ловлей, попыткой, но я недостаточно хорошо осведомлен, чтобы правильно это закодировать.

0x01AA

Лично я бы потратил еще немного работы на случай, если кому-то понадобится прочитать целое число. Я имею в виду чтение символа за символом, чтобы проверить, является ли это цифра или знак, и принять его или нет.

getchar-ссылка на C++ [^]

Наконец, это закончится только одним исключением "вне диапазона", потому что сам вход уже полностью валидирован ;)

Richard MacCutchan

getchar это старый стиль C, а не C++, и он плохо сочетается с std::cin.

0x01AA

Я все понял, спасибо. Я не очень хорошо знаком с этой старой консольной штукой. Это было что-то до 25 лет, когда я использовал его в последний раз в модуле 2 ;)

2 Ответов

Рейтинг:
8

Jochen Arndt

После ввода данных используйте ios:: fail-ссылка на C++ [^] флаг, чтобы проверить, был ли вход действительным числом:

cin >> age;
if (std::cin.fail())
    // report not a number
else if (age < 0 || age > 122)
    // report invalid range
Вместо того чтобы сообщать напрямую, вы также можете создать исключение и сообщить об этом из обработчика catch:
try
{
    cin >> age;
    if (std::cin.fail())
        throw 1;
    if (age < 0 || age > 122)
        throw 2;
}
catch (int err)
{
    // report here according to err
}
Общий обзор исключений C++ см. В разделе Исключения - Учебники По C++ [^].

Вы также можете включить iostream исключения установка маски исключения (см. ios:: исключения-ссылка на C++ [^]).


Richard MacCutchan

Спасибо, я забыл о провальном тесте. Но я думаю, что вы хотели написать std::cin.fail()

Jochen Arndt

Спасибо тебе, Ричард,что поймал это.

Должно быть, я сбился с курса cin.fail().

Рейтинг:
2

Richard MacCutchan

Вам нужно прочитать ввод в виде текстовой строки, а затем проверить ее на наличие допустимых символов. То cin метод будет просто читать символы до тех пор, пока не найдет нецифру и не вернет любое значение, которое может быть преобразовано из любых введенных цифр.

[редактировать]
Предложение Йохена ниже-лучшая идея.
[/редактировать]