【问题标题】:Having to hit enter twice with cin.getline()必须用 cin.getline() 输入两次
【发布时间】:2018-10-20 14:20:38
【问题描述】:

我知道以前有人问过类似的问题,但我真的不知道我的代码有什么问题。出于某种原因,如果我输入“n”,我必须按两次 Enter。但如果我输入“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;
}

【问题讨论】:

    标签: c++ string try-catch


    【解决方案1】:

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

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

    checkinput 变为:

    bool checkInput(string c) {
        if (c.length() > 1)
            return false;
    
        return c == "Y" || c == "y" || c == "N" || c == "n";
    }
    

    现在您可以简化 do-while 并删除 try 语句。此外,现在不需要 test 变量,因为我们成功地获取了 any 输入:

    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);   
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多