试图验证int输入并拒绝小数和空格

时间:2019-04-30 18:12:50

标签: c++

当用户输入的内容类似于“ 3.2”或“ 3 2”时,我正在使用的验证循环将第一个数字用作有效的整数,然后自动将第二个数字作为对下一个提示的答案。我希望它完全拒绝除整数以外的任何东西。

这是我代码的相关部分-

Form.AccessibilityObject

我使用static_cast将菜单的大小转换为int形式,否则出现编译错误,指出这不是适当的比较。我还没有看到其他示例使用此功能,所以我不知道这是否是导致不正确地接受“ 3.2”和“ 3 2”作为有效输入的原因。

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