Как прочитать строку с пробелами
cin >> s читает только одно слово — до пробела. Всю строку целиком читает getline:
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
getline(cin, line);
cout << "[" << line << "]\n";
cout << line.size() << "\n";
return 0;
}Hello big world[Hello big world]
15getline(cin, line) читает всё до перевода строки (сам перевод строки в line не попадает).
getline после cin >> пропускает ввод
Самая частая ловушка: сначала читают число, потом строку — а строка получается пустой.
#include <iostream>
#include <string>
using namespace std;
int main() {
int age;
string name;
cin >> age;
getline(cin, name); // прочитает пустую строку!
cout << age << " [" << name << "]\n";
return 0;
}16
Ivan Petrov16 []cin >> age читает 16 и останавливается перед переводом строки. getline видит этот перевод строки сразу и возвращает пустую строку. Исправление — пропустить остаток строки после числа:
#include <iostream>
#include <string>
using namespace std;
int main() {
int age;
string name;
cin >> age;
cin >> ws; // пропустить пробелы и переводы строк
getline(cin, name);
cout << age << " [" << name << "]\n";
return 0;
}16
Ivan Petrov16 [Ivan Petrov]cin >> ws пропускает все пробельные символы до первого видимого. Он же пропустит и пустые строки, и пробелы в начале нужной строки — обычно это то, что надо. Если пробелы в начале строки важны, вместо него пишут cin.ignore(numeric_limits<streamsize>::max(), '\n'); (нужен #include <limits>) — пропустить всё до конца текущей строки включительно. Короткий вариант cin.ignore(); пропускает ровно один символ и не спасёт, если после числа есть пробел.
Все строки до конца ввода
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
int count = 0;
while (getline(cin, line)) {
count++;
cout << count << ": " << line << "\n";
}
return 0;
}first line
second line
third line1: first line
2: second line
3: third linewhile (getline(cin, line)) повторяется, пока строки есть; в конце ввода условие становится ложным. При вводе с клавиатуры конец ввода — Ctrl+D в Linux и macOS, Ctrl+Z и Enter в Windows.
Подводные камни
- Файл из Windows в Linux. Строки в Windows заканчиваются двумя символами
\r\n. Если такой файл читают в Linux, в конце каждой строки остаётся\r, и строки не совпадают с ожидаемыми. Уберите его:if (!line.empty() && line.back() == '\r') line.pop_back();. - Разделитель. Третий аргумент меняет конец строки:
getline(cin, part, ',')читает до запятой. - getline для строки C —
cin.getline(buf, size)— это другая функция, для массивовchar. Дляstringнужна свободная функция (не методcin)getline(cin, s).