использование getline() и cin

почему исполняется блок else при истинном значении if? в консоле ввожу "get word", начинает исполняться блок if. ввожу слово, нажимаю enter. программа выводит значение переменной g и исполняет блок else. если поменять getline() на cin>> то все работает нормально: блок else исполняется только при ложном значении условия if.

    while(true)

{
    string entr, g;
    getline(cin, entr);

    if (entr == "get word")
    {
        cin >> g;
    }
    else
        cout << "###########" << endl;
    cout << g << endl;
}

Ответы (2 шт):

Автор решения: Qwertiy

После cin в буфере остаётся перевод строки, который считывается следующем вызовом getline и в entr оказывается пустая строка, которая, очевидно, не равна проверяемой, поэтому исполняется else.

Надо после cin добавить getline или хотя бы getchar, а ещё лучше вообще не смешивать его с чтением строк и читать слово тоже через getline.

PS: А вообще, для этого уже лет 15 как существуют шикарные инструменты отладки - выполняешь по шагам и смотришь, что у тебя в переменных.

→ Ссылка
Автор решения: junior

В приведенной выше программе произошла не одна, а две итерации цикла. В первой итерации в переменную entr было записано "get word", затем выполнился блок if, где cin после записи переменной g перезаписал entr засунув туда пустую строку. Поэтому, во второй итерации исполнился блок else. А я ошибочно принял это все за одну итерацию цикла. Чтобы этого не происходило нужно очищать буфер при помощи команды cin.ignore().

Привожу пример консольной програмки где можно это использовать:

setlocale(0, "ru");
while(1)
{
    string entr;
    int x, y, z;
           
    getline(cin, entr);

    if (entr == "calculate cube")
    {
        cout << "   enter X:  ";
        cin >> x;
        cout << "   enter Y:  ";
        cin >> y;
        cout << "   enter Z:  ";
        cin >> z;
        cout << "\n   cube volume:   " << x * y * z << " m3" << endl;
        cin.ignore();
    }
    else if (entr == "help")
        cout << "   culculate cube - вычисляет объем\n   get base - показать данные\n   ......и т.д\n";
    else
        cout << "   invaled comand!" << endl;
}

очищаем буфер командой cin.ignore

→ Ссылка