必须使用cin.getline()按两次输入

时间:2018-05-10 10:26:23

标签: c++ string try-catch

我知道以前曾经问过类似的问题,但我真的无法弄清楚我的代码有什么特别的错误。出于某种原因,如果我输入" n"我必须按两次输入。但是,如果我输入" y",一切正常,代码将移至下一部分。我的代码如下:

do{
    try {
        if (test) cout << " Re-enter: ";
        test = false;
        getline(cin, choice);
        checkinput(choice);
    }
    catch (int flag) {
        if (flag == 1){ cout << "Error: Input must be y or n."; test = true; }
    }
} while (test);

,checkinput功能如下:

// function for checking the input of y/n
string checkinput(string c) {
    if (c != "Y" && c != "y" && c != "N" && c != "n") {
        throw 1;
    }
    if (cin.fail()) throw 1;
    return c;
}

1 个答案:

答案 0 :(得分:0)

我认为你在这里做的太多了。你可以简化这个。

无需在checkinput内抛出和捕获异常。由于只有两种情况,您可以使用布尔值。其次,你要回来了。我不知道你为什么这样做,它没有被使用。你应该返回一个布尔值。

checkinput变为:

bool checkInput(string c) {
    if (c.length() > 1)
        return false;

    return c == "Y" || c == "y" || c == "N" || c == "n";
}

现在您可以简化do-while并删除try语句。此外,由于我们成功抓取任何输入,因此现在不需要test变量:

int main() {
    string choice = "";

    do {
        cout << "Enter yes or no (y/n): ";
        getline(cin, choice); // or cin >> choice;

        bool check = checkInput(choice);

        if (!check)
            cout << "Error: Input must be y or n." << endl;

    } while (true);   
}

您也可以进一步简化此操作,但这会以可读性为代价。祝你好运!