当用户输入的内容类似于“ 3.2”或“ 3 2”时,我正在使用的验证循环将第一个数字用作有效的整数,然后自动将第二个数字作为对下一个提示的答案。我希望它完全拒绝除整数以外的任何东西。
这是我代码的相关部分-
Form.AccessibilityObject
我使用static_cast将菜单的大小转换为int形式,否则出现编译错误,指出这不是适当的比较。我还没有看到其他示例使用此功能,所以我不知道这是否是导致不正确地接受“ 3.2”和“ 3 2”作为有效输入的原因。
答案 0 :(得分:1)
该问题似乎并非归因于static_cast。似乎更多关于cin
的行为。当您将“ 3.2”输入接受到int输入中时,将隐式转换为整数,并且此时的输入值可能为3,因为当您将float隐式转换为int时,它将丢失小数点后的数字。
尽管如此,您似乎想要确保输入行仅包含一个整数,而仅包含一个整数。因此,采用该行输入并使用std::stoi
进行解析。它将引发异常或告诉您整数在字符串中的何处。然后只需确保该行的其余部分为whitespace
。
std::optional<int> tryParseAsInt(const std::string& s)
{
try
{
size_t n = 0;
const int x = std::stoi(s, &n);
if (std::all_of(s.begin() + n, s.end(), [](unsigned char c) { return std::isspace(c); }))
return x;
}
catch (const std::invalid_argument&)
{
}
catch (const std::out_of_range&)
{
}
return std::nullopt;
}
std::optional<int> x{};
std::string line;
while (!std::getline(std::cin, line) || !(x = tryParseAsInt(line)) || !(0 <= x && x < 10))
{
std::cin.clear();
std::cout << "Try again: ";
}
std::stringstream
检查eof
。如果您不想打扰例外情况,也可以使用std::from_chars
。答案 1 :(得分:1)
您可以使用// instead of while loop
inputStream.copyTo(outputStream, bufferSize = 1024)
消耗整个输入行,然后对输入执行验证。
由于您对正的十进制数感兴趣,因此可以检查输入内容是否仅包含十进制数字。一种方法是在字符串上使用std::getline
方法,以查看是否找到除十进制数字以外的任何内容。
您可能仍需要对值进行边界检查,因为字符串可能仍指定了不在first_not_of
范围内的数字。
int