почему getline() не завершается при вводе новой строки?

#c

#c

Вопрос:

У меня есть этот код:

 string sentence2;
while(getline(cin, sentence2)){
    // while there are lines coming in
    cout << sentence2 << endl;
}
 

в VSCode я помещаю свой окончательный ввод в виде пустой строки, нажав клавишу «Enter». Код вернул пустую строку. Почему цикл не завершается вместо этого?

Комментарии:

1. Что именно C Primer говорит в этом отношении? Вполне возможно, что объяснение правильное, но неверно истолковано.

2. getline возвращает ссылку на поток, который вы передали ему, и этот поток оценивается как false, если он находится в состоянии ошибки (другими словами, если последнее чтение не удалось). Чтение пустой строки не является ошибкой.

3. @KelvinNgure getline возвращает, что означает, что код выполняется, но сам цикл while не заканчивается, пока его условие не примет значение false . Как упоминалось в ответе, для потоков это происходит при сбое чтения. getline Здесь So завершается успешно, и возвращаемое значение принимает значение true, поэтому цикл продолжается.

4. @KelvinNgure … и поскольку ответ, похоже, помог решить вашу проблему, не могли бы вы также принять его?

5. @Ted Lyngmo, готово! Я даже не знал, что могу это сделать

Ответ №1:

Вы можете добавить условие, чтобы проверить, что строка не пуста:

 string sentence2;
while(getline(cin, sentence2) amp;amp; not sentence2.empty()){
    // while there are lines coming in
    cout << sentence2 << endl;
}
 

std::getline возвращает ссылку на cin и cin будет находиться в состоянии сбоя, если он не смог ничего прочитать — но даже для пустой строки требуется успешное чтение (of n ), чтобы не переводить ее в состояние сбоя.

Комментарии:

1. Я годами кодирую C и никогда не знал, что вы можете использовать not взаимозаменяемо с ! (я знал о iso646.h в C, но не понимал, что они являются реальными ключевыми словами в C ).

2. И все это время я использовал amp;amp; sentence2.length() != 0 . Мне нравится not empty() .

3. @dreamlax я начал использовать not , когда из-за моего зрения я начал скучать ! 🙂

4. @DavidC.Rankin Да, в этой строке есть что-то приятное not , empty что облегчает чтение.