Вопрос по c++, istream – Это ошибка с getline (), или я делаю что-то не так. Правильный способ использовать getline ()?

5

Возможно, это не ошибка, но я не знаю, что происходит не так. Моя первая запись повторяется для str1 на 2-й итерации, и это то же самое с тех пор. Только первая итерация идет хорошо.

#include <iostream>
#include <string>
using namespace std;

int main () {

cout << " \n Enter two words. \n " ;
char c = 'y';
string str;
string str1;
while (c == 'y'){

    getline(cin,str);

    getline (cin,str1);

    cout << " \n\n str : " << str << " str1 : " << str1 ;
    cout << " \n Continue ? \n " ;
    cin >> c;
}

return 0;
}

Выход:

 Enter two words.
 hello world
this is mr


 str : hello world str1 : this is mr
 Continue ?
 y
hello world


 str :  str1 : hello world
 Continue ?
 n


@ Robᵩ Я уже давно занимаюсь сбором Stackoverflow (это мой первый вопрос). Это всегда полезно, и это была хитрая ошибка, которую я сделал, сниппет, вероятно, сэкономил часы ударов головы и протискивания клавиши Enter ... ani
Добро пожаловать в ТАК! Спасибо за предоставление полной короткой программы, которая демонстрирует вашу проблему. Это былоочен полезно с вашей стороны. Пожалуйста, посмотри Sscce.org за дополнительной информацией Robᵩ
После того, как ты нажмешьy, вы, вероятно, нажали Enter. Вы должны подумать, какая часть программы, которая читает символ новой строки, сделана, когда вы нажали эту клавишу Enter. nos
@ chris cin - это объект, может быть, вы имеете в виду оператор >> Jonathan Wakely

Ваш Ответ

2   ответа
1

Но альтернативное исправление выглядит лучше:

// change
char c = 'y';
....
while (c == 'y'){
....
    cin >> c;

// Into
std::string c = "y";
....
while (c == "y"){
....
    std::getline(cin, c);

При работе с ручным пользовательским вводом вы должны быть осторожны при использовании оператора >>, так как это всегда оставляет на входе символ \ n Это означает, что вы можете использовать метод, который извлекает символ '\ n' (getline ()), или вы можете вручную удалить его после слов (ignore ()).

Спасибо, посмотрите на этот фрагмент, я нашел правильную позицию, чтобы игнорировать () Cin. : -) ani
3

Добавлят

cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

после вашего

cin >> c;

Рассмотрите следующий вход:

    dog
    cat
    y
    owl
    fish
    n

Если мы отдельно изучим символы, присутствующие во входном потоке, мы увидим:

    d o g \n c a t \n y \n o w l \n f i s h \n n \n

Первый звонокgetline потребляетdog\n; вторая потребляетcat\n, оставив это:

    y \n o w l \n f i s h \n n \n

Первый звонокcin >> c потребляет толькоy но не последующий перевод строки, оставив это:

    \n o w l \n f i s h \n n \n

Теперь начинается самое интересное: что происходит во время следующего звонкаgetline? Почему это читается до следующего перевода строки, конечно. Так что следующий звонок наgetline возвращает пустая строка и уходитowl... во входном потоке.

Решение, как я обрисовал выше, состоит в том, чтобы использовать остаток (теперь бесполезной) строки ввода.

Спасибо, я думал о том же. Вы подтвердили это для меня. Что касается решения, я очищаю буфер cin, используя ignore (). Тем не менее, это не сработало. Потому что я поставил его в неправильное положение, т. Е. До того, как cin >> c. (Это часть проекта, поэтому у меня есть год, прежде чем я приму выбор.)

Похожие вопросы