我试图只允许整数值进入程序,所以我做了以下函数。该功能与我在网上看到的其他功能相似,并且在我添加!之前,我的功能似乎还可以正常工作。在它前面检查是否某些东西不是int。
检查输入是否为整数的函数:
bool isInteger(std::string s)
{
for (int i = 0; i < s.length(); i++)
{
if (isdigit(s[i]) == false)
{
return false;
}
return true;
}
}
正在使用的功能:
int getLevel()
{
int level;
std::cout << "Level One\n";
std::cout << "Level Two\n";
std::cout << "Level Three\n";
std::cout << "Level Four\n";
std::cout << "Level Five\n";
std::cout << "Enter your level (1-5): ";
std::cin >> level;
while (!isInteger(std::to_string(level)) || level < 1 || level > 5)
{
std::cout << "Enter an integer value between 1-5 inclusive: ";
std::cin >> level;
}
clrscr();
return level;;
}
我相信该功能在输入!之前都可以正常工作。在它前面。我试图仅允许将整数输入到程序中,并且当我输入双精度或字符串时,控制台将显示以下消息:“输入1-5之间的整数值:”,并且没有任何时间输入输入。我对C ++编程相当陌生,可以使用一些建议。谢谢!
答案 0 :(得分:1)
Element = items, Depth = 0
Element = item, Depth = 1
Element = name, Depth = 2
Element = ppu, Depth = 2
Element = batters, Depth = 2
Element = batter, Depth = 3
Element = batter, Depth = 3
Element = batter, Depth = 3
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
将尝试读取一个整数,并且它将永远不会读取除整数以外的任何内容。如果失败,则设置std::cin >> level;
的{{1}},并跳过其他输入操作(如循环内的std::cin
)。
您需要检查读取是否成功,否则请忽略当前输入。例如:
failbit
一些半相关的提示:std::cin >> level;
将始终为整数。将其转换为字符串始终始终是整数的字符串表示形式,因此std::cout << "Enter your level (1-5): ";
while(!(std::cin >> level) || level < 1 || level > 5) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Enter an integer value between 1-5 inclusive: ";
}
将始终始终为level
,除非{{1} }为负数,因为您不检查符号。
另外,isInteger(std::to_string(level))
中的true
必须在循环之外,否则您只检查第一个字符。
答案 1 :(得分:1)
感谢所有答复和澄清,我设法提出了自己的解决方案。
新的isInteger函数现在可以检查所需的所有内容,包括上面用户建议的输入“ 0004”:
bool errorCheck(std::string s)
{
int intLevel;
std::stringstream tempLvl(s);
tempLvl >> intLevel;
for (int i = 0; i < s.length(); i++)
{
if (isdigit(s[i]) == false || s[0] == '0' || intLevel < 1 || intLevel > 5)
{
return false;
}
}
return true;
}
正在使用的方法:
std::cout << "Enter your level (1-5): ";
std::cin >> stringLevel;
while (!errorCheck(stringLevel))
{
std::cout << "Enter an integer value between 1-5 inclusive: ";
std::cin >> stringLevel;
}
std::stringstream lvl(stringLevel);
lvl >> level;
clrscr();
return level;
}
如果您发现代码中有任何问题或有更简单的解决方案,请告诉我。感谢您的所有帮助!
答案 2 :(得分:0)
好吧,我要告诉你一个事实,就是控制台输入会从控制台中提取输入,所以如果你曾经尝试做类似的事情
也就是说,读取字符串代替整数cin
会处于错误状态,您可以通过像这样放置if
来检查这一事实
if(!cin>>level) break;
,您将发现它实际上在工作,流从控制台接收了输入并将其转换为boolean
值,因此您始终可以检查其状态为错误状态,返回false
否则为true
... .....
因此,最终该错误位于cin>>level
中...
希望您理解...。也请查看该return true
语句。
我将为您提供有关此错误的更多答案的参考链接... user enters String instead of Int