仅接受整数输入

时间:2019-03-02 02:36:11

标签: c++ input int

我发现这个类似的问题被问了很多遍了,但是我仍然找不到我的解决方案。

在我的情况下,我想在用户输入1到5的数字时显示某些内容,当他输入错误的字符(例如“ 3g”,“ 3。”,“ b3”和任何浮点数字)时出现错误

我尝试了下面的代码,但它创建了许多其他问题。就像我输入 3g 3.5 一样,它只会采用 3 而忽略其余内容,因此(!cin)< / code>根本不起作用。

第二,如果我输入类似字符的内容,则 __ userChoice 将自动转换为 0 ,并且程序会打印出“”请从1中选择一个数字到5。“ 而不是”输入无效,请输入一个整数。\ n“ ,这就是我想要的。

  cout <<“请选择:”;
cin >> __userChoice;
如果(__userChoice> 0 && __userChoice <5){
    cout <<“您选择菜单项” << __userChoice <<“。处理中...完成!\ n”;
}
否则(__userChoice == 5){
    Finalization(); //调用出口
}
否则,如果(__userChoice <= 0 || __userChoice> 5){
    cout <<“请从1到5之间选择一个数字。\ n”;
}
其他(!cin){
    cout <<“输入无效,请输入整数。\ n”;
}
cin.clear();
cin.ignore(10000,'\ n');
 

1 个答案:

答案 0 :(得分:1)

operator>>不能保证在发生故障时输出有意义的整数值,但是您不会在评估__userChoice以及结构if的方式之前检查是否存在故障。 else (!cin)支票将永远无法获得。但是,即使operator>>成功了,您也不会检查用户是否输入了多个整数。

要执行您要的操作,应首先使用std::getline()std::cin读入std::string,然后再使用std::istringstreamstd: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";
}