Принять только целое число для ввода - PullRequest
0 голосов
/ 02 марта 2019

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

В моем случае я хочу отобразить что-то, когда пользователь вводит число от 1 до 5, выдавайте ошибку, когда он вводит что-то неправильное, например символы, «3g», «3.», «b3» и любое число с плавающей точкой.

Я попробовал приведенный ниже код, но это создало так много других проблем.Например, если я введу 3g или 3.5, он возьмет только 3 и проигнорирует все остальное, поэтому (!cin) не будет работать вообще.

Во-вторых, если я введу что-то вродесимвол __userChoice будет автоматически преобразован в 0, и программа напечатает "Please select a number from 1 to 5." вместо "Invalid input, please input an integer number.\n", что я и хочу.

cout << "Please select: ";
cin >> __userChoice;
if (__userChoice > 0 && __userChoice < 5) {
    cout << "You select menu item " << __userChoice <<". Processing... Done!\n";
}
else if (__userChoice == 5) {
    Finalization(); //call exit
}
else if (__userChoice <= 0 || __userChoice > 5) {
    cout << "Please select a number from 1 to 5.\n";
}
else (!cin) {
    cout << "Invalid input, please input an integer number.\n";
}
cin.clear();
cin.ignore(10000, '\n');

1 Ответ

0 голосов
/ 02 марта 2019

operator>> не гарантируется вывод значащего целочисленного значения в случае сбоя, но вы не проверяете сбой перед оценкой __userChoice, а способ структурирования ваших if проверок else (!cin) никогда не будетбыть достигнутым.Но даже если operator>> успешен, вы не проверяете, вводил ли пользователь больше, чем просто целое число.

Чтобы сделать то, что вы просите, вы должны сначала прочитать std::cin в std::stringиспользуя std::getline(), а затем используйте std::istringstream или std:stoi() (или эквивалентный) для преобразования string в int с ошибкойпроверка.

Например:

bool strToInt(const std::string &s, int &value)
{
    std::istringstream iss(s);
    return (iss >> value) && iss.eof();

    // Or:

    std::size_t pos;
    try {
        value = std::stoi(input, &pos);
    }
    catch (const std::exception &) {
        return false;
    }
    return (pos == input.size());
}

...

std::string input;
int userChoice;

std::cout << "Please select: ";
std::getline(std::cin, input);

if (strToInt(input, userChoice))
{
    if (userChoice > 0 && userChoice < 5)
    {
        std::cout << "You selected menu item " << userChoice <<". Processing... Done!\n";
    }
    else if (userChoice == 5)
    {
        Finalization(); //call exit
    }
    else
    {
        std::cout << "Please select a number from 1 to 5.\n";
    }
}
else
{
    std::cout << "Invalid input, please input an integer number.\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...