использование 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 шт):
После cin в буфере остаётся перевод строки, который считывается следующем вызовом getline и в entr оказывается пустая строка, которая, очевидно, не равна проверяемой, поэтому исполняется else.
Надо после cin добавить getline или хотя бы getchar, а ещё лучше вообще не смешивать его с чтением строк и читать слово тоже через getline.
PS: А вообще, для этого уже лет 15 как существуют шикарные инструменты отладки - выполняешь по шагам и смотришь, что у тебя в переменных.
В приведенной выше программе произошла не одна, а две итерации цикла. В первой итерации в переменную 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;
}
