已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
昨天关门了。
Improve this question
我试图创建一个期望值的函数,因为我在代码的几个部分使用了它。我想添加这些保护措施,以防输入了一些无效值(十进制或超出范围)。
unsigned short getChoice(short min, short max) {
short choice;
bool valid = false;
while (!valid) {
std::cin >> choice;
if (std::cin.fail() || choice < min || choice > max) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Invalid Choice, Try Again.\n" << std::endl;
}
else {
valid = true;
}
}
return choice;
}
我找到了这段代码,但是它有几个问题,因为它接受十进制数,向下舍入,即使代码中没有明确说明,这是我不理解的行为。
另外一个问题是当一个数字是无效的时候,当按回车键的时候,它会被下一个std::cin拉出来,这本来是不应该发生的,我怎么清除这个值呢?
2条答案
按热度按时间enyaitl31#
operator>>
在遇到不属于正在读入的类型的字符时停止阅读。因此,由于您正在读入不能保存十进制值的short
,如果用户键入十进制值,则operator>>
将愉快地仅读入.
前面的整数部分,而留下其余部分(包括'.'
),以供后续读取。例如,如果用户键入
5.25
,则operator>>
将返回5
并将.25
留在输入缓冲区中。对于您所尝试的,您需要在验证之前读入整个值。我建议先阅读
std::string
,然后再解析它,例如:anauzrmj2#
不确定你想告诉你添加的代码,但如果你想检查一个小数是例如超出范围,为什么你不只是:'
'如果你给予一个float作为一个Var go give给函数,我的调试器返回一个错误,这是不可能的。让我知道这是否是你所要求的