Необходимо дважды нажать enter, используя cin.getline () - PullRequest
0 голосов
/ 10 мая 2018

Я точно знаю, что подобные вопросы уже задавались ранее, но я действительно не могу понять, что конкретно не так с моим кодом.По какой-то причине, если я ввожу «n», я должен дважды нажать клавишу ввода.Но если я введу «у», все работает нормально, и код переходит к следующему разделу.Мой код выглядит следующим образом:

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 голосов
/ 10 мая 2018

Я думаю, что вы пытаетесь сделать слишком много здесь. Вы можете упростить это.

Нет необходимости создавать и ловить исключения внутри 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);   
}

Вы также можете упростить это, но это будет стоить читабельности. Удачи!

...