Getline() всегда принимает ввод

Я снимаю видео со своей веб-камеры, и если пользователь нажимает клавишу Enter, я делаю снимок. Затем я спрашиваю: «Фотография в порядке?» пользователю и дождаться ввода. Если он говорит «Нет», я продолжаю делать то же самое, пока он не скажет «Да».

Но если он говорит «Нет», а тем временем я что-то набираю в терминале, функция getline() записывает все, что я набираю, в свой буфер, и когда я снова задаю вопрос, она сразу переходит в состояние «неверный ввод».

Как предотвратить это?

Я прочитал много вопросов по этому поводу и пытался использовать cin.ignore() и cin.clear() до/после вызова getline(), но они не помогли.

    // Do capturing here
    string choice;    
    int choiceIsOkay = 0;
    while (choiceIsOkay == 0)
    {
        cout << "Is the picture okay? (Y/N): "; 
        getline(cin, choice);

        if ((choice == "Y") || (choice == "y"))
        {
            choiceIsOkay = 2;
        }

        else if ((choice == "N") || (choice == "n"))
        {
            choiceIsOkay = 1;
        }

        else
        {
            cout << "\nInvalid input\n";
            choiceIsOkay = 0;
        }
    }

if (choiceIsOkay == 2)
{
    runAlgorithm = 1;
    break;
}

else choiceIsOkay = 0;

person massakrienen    schedule 25.10.2015    source источник
comment
Этого следовало ожидать. Почему вы печатаете что-то, когда ваша программа ожидает ввода только ENTER и Y/N?   -  person Dúthomhas    schedule 26.10.2015
comment
@ Дутом по ошибке. Я хотел бы принять все меры предосторожности.   -  person massakrienen    schedule 26.10.2015
comment
Ах хорошо. Вы мало что можете с этим поделать, кроме как потребовать, чтобы ваши пользователи обращали внимание на то, что они печатают. Вы можете просто игнорировать все, кроме последней буквы «Y» или «N».   -  person Dúthomhas    schedule 26.10.2015


Ответы (1)


Насколько я понимаю вашу проблему, если пользователь вводит Some Random Text In, ваша программа всегда переходит в «Неверный ввод» и никогда не останавливается, чтобы дождаться ввода пользователя. Следующий код должен решить вашу проблему.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int runAlgorithm;
    // Do capturing here
    int i = 0;
    while (i++ < 3)
    {
        int choiceIsOkay = 0;
        string choice;
        while (choiceIsOkay == 0)
        {
            cout << "Is the picture okay? (Y/N): ";
            getline(cin, choice);

            if ((choice == "Y") || (choice == "y"))
            {
                choiceIsOkay = 2;
            }

            else if ((choice == "N") || (choice == "n"))
            {
                choiceIsOkay = 1;
            }

            else
            {
                cout << "nInvalid inputn";
                choiceIsOkay = 0;
            }

            // Ignore to the end of line
            cin.clear();
        }
    }

    return 0;
}
person manman    schedule 26.10.2015