我的while循环条件没有像我期望的那样评估它们

时间:2018-12-20 03:47:55

标签: c++

我正在尝试创建一个输入验证功能,以检查cin是否失败(这可以正常工作),并且我也试图使其进行检查以查看它是否在我通过变量传递给的最大最小值范围内功能。

我已经尝试过处理不同的条件并手动评估它,但似乎我丢失了while循环的一些小细节或完全不同的东西。

void isValid(int &value, std::string message, int min, int max) {
    while(((std::cout << message) && !(std::cin >> value)) && ((value >= min) && (value <= max))) {
        std::cout << "Error with input" << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<int>::max(), '\n'); }

我希望isValid(-1,“ Enter the test score:”,0,100)的输出继续要求输入有效,但它原样接受。

1 个答案:

答案 0 :(得分:1)

我认为您在条件循环中尝试执行过多操作。事实证明,您-作者,以及最有可能一眼理解代码的人-都对布尔逻辑感到困惑。

为了使逻辑更简单,更易于阅读和更正,我们可以应用separation of concerns原理将代码分为两部分:一个负责获取输入,另一个负责处理发生的事情如果失败:

// returns true if a valid value entered, false if invalid or I/O error
bool getInput(int& value, const std::string& message, int min, int max) {
    if (!(std::cout << message)) return false;
    if (!(std::cin >> value)) return false;
    return value >= min && value <= max;
}

void getValidInput(int& value, std::string message, int min, int max) {
    while (!getInput(value, message, min, max)) {
        std::cout << "Error with input" << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<int>::max(), '\n'); }
    }
}

重试std::cout是否有错误;重试不太可能导致成功,并且可能意味着您的程序出了点问题。您可以考虑在此处抛出异常。