我发现这个类似的问题被问了很多遍了,但是我仍然找不到我的解决方案。
在我的情况下,我想在用户输入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');
答案 0 :(得分:1)
operator>>
不能保证在发生故障时输出有意义的整数值,但是您不会在评估__userChoice
以及结构if
的方式之前检查是否存在故障。 else (!cin)
支票将永远无法获得。但是,即使operator>>
成功了,您也不会检查用户是否输入了多个整数。
要执行您要的操作,应首先使用std::getline()
从std::cin
读入std::string
,然后再使用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";
}