c++ 如何创建一个函数,该函数需要一个范围内的整数值,而不接受小数值,无论是用点还是逗号分隔[已关闭]

rdlzhqv9  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(223)

已关闭。此问题需要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拉出来,这本来是不应该发生的,我怎么清除这个值呢?

enyaitl3

enyaitl31#

operator>>在遇到不属于正在读入的类型的字符时停止阅读。因此,由于您正在读入不能保存十进制值的short,如果用户键入十进制值,则operator>>将愉快地仅读入.前面的整数部分,而留下其余部分(包括'.'),以供后续读取。
例如,如果用户键入5.25,则operator>>将返回5并将.25留在输入缓冲区中。
对于您所尝试的,您需要在验证之前读入整个值。我建议先阅读std::string,然后再解析它,例如:

unsigned short getChoice(short min, short max) {
    std::string input;
    std::size_t pos;
    int value;

    while (std::cin >> input) {
        try {
            value = std::stoi(input, &pos);
            if (input[pos] == '\0' && value >= min && value <= max)
                return static_cast<unsigned short>(value);
        }
        catch (const std::logic_error &) {}

        std::cout << "Invalid Choice, Try Again.\n" << std::endl;
    }

    throw std::runtime_error("input failed");
}
anauzrmj

anauzrmj2#

不确定你想告诉你添加的代码,但如果你想检查一个小数是例如超出范围,为什么你不只是:'

int myfunction(int var)
{
if(var>2147483647)
{
cout<<"ERROR! Var out of Range! This may result as an error!";
return 1;
}

//else do something
return 0;

}

'如果你给予一个float作为一个Var go give给函数,我的调试器返回一个错误,这是不可能的。让我知道这是否是你所要求的

相关问题