getline () не работает второй раз в цикле while - PullRequest
2 голосов
/ 31 декабря 2011

Во-первых, это код цикла while:

void Menu() {
    string option;
    char yes;
    yes='y';
    while (yes == 'y') {
    cout << "Commands: buy, sell, directory, and exit: ";
    getline (cin, option);
    if (option == "buy") {
        ...
    }
    ...
cout << "Do you wish to continue? Press y for yes, n for no: ";
cin >> yes;
}
}

В этом случае, когда цикл отключается во второй раз (нажмите да), он возвращается к:

cout << "Do you wish to continue? Press y for yes, n for no: ";

Я думаю, что этоимеет некоторое отношение к предоставлению ответа на getline () рано, но я не знаю, где.

IE:

Here is the menu: Commands: buy, sell, directory, and exit: buy
Enter a player's I.D: 2
Here is your current money after purchasing Player X: 150000
Do you wish to continue? Press y for yes, n for no: y
Commands: buy, sell, directory, and exit: Do you wish to continue? Press y for yes, n for no: y
Commands: buy, sell, directory, and exit: Do you wish to continue? Press y for yes, n for no:

Намерение состоит в том, чтобы повторить цикл при нажатии yes (включаявозможность ввода другой команды).

Ответы [ 4 ]

9 голосов
/ 31 декабря 2011
cin >> yes;

Тут же пользователь вводит букву, скажем, 'y'. Затем хиты войти. Это хранит 2 символа во входном буфере, 'y' и '\ n'. 'Y' сохраняется в yes, но '\ n' остается. Когда вы снова попадаете сюда:

getline (cin, option);

Поскольку в буфере уже есть символ новой строки, getline имеет то, что он ищет, и ему не нужно подсказывать пользователю.

Есть несколько решений для этого. Вы можете добавить вызов к cin.ignore() после cin >> yes. Или вы можете сделать yes строку и использовать getline вместо operator>>.

0 голосов
/ 23 февраля 2017

Проблема в том, что cin оставляет новую строку в потоке, который читает вызов getline ().

Попробуйте добавить cin.ignore (1, '\ n');после cin, чтобы удалить эту новую строку.:)

0 голосов
/ 24 июля 2016

Иногда cin.Clear () или просто cin.ignore () не работает. Я не исследовал почему, но я нашел другой ответ. Насколько я понимаю, в буфере все еще есть вещи, которые вызывают это. как один из других плакатов заявил ...

cin.ignore(cin.rdbuf()->in_avail(),'\n');

решит проблему. Поместите эту строку кода прямо перед вашим первым оператором getline после того, как задаете первый вопрос.

http://www.cplusplus.com/forum/beginner/20206/

0 голосов
/ 30 марта 2015

Это потому, что \n останется в буфере после первого cin. Вы можете решить эту проблему, добавив пустой cin.get() между двумя последовательными чтениями. Просто поставь счетчик и первую проверку:

//(...)

int count = 0;

//(...)

while (yes == 'y') 
{
    if (count == 0)
    {
        // "Clear the very first input"
        cin.get();
    }

    cout << "Commands: buy, sell, directory, and exit: ";
    getline (cin, option);
    if (option == "buy") {
        ...
    }
    ...
    cout << "Do you wish to continue? Press y for yes, n for no: ";
    cin >> yes;

    // Increment the counter
    count++;
}

Шрифты:

Невозможно получить символ от cin.get ()

http://www.cplusplus.com/reference/istream/istream/get/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...