Глиф Учебники

Как прочитать строку с пробелами

Справочник · C++ · 1 минута чтения

cin >> s читает только одно слово — до пробела. Всю строку целиком читает getline:

C++
#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]
15

getline(cin, line) читает всё до перевода строки (сам перевод строки в line не попадает).

getline после cin >> пропускает ввод

Самая частая ловушка: сначала читают число, потом строку — а строка получается пустой.

C++
#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 Petrov
Вывод
16 []

cin >> age читает 16 и останавливается перед переводом строки. getline видит этот перевод строки сразу и возвращает пустую строку. Исправление — пропустить остаток строки после числа:

C++
#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 Petrov
Вывод
16 [Ivan Petrov]

cin >> ws пропускает все пробельные символы до первого видимого. Он же пропустит и пустые строки, и пробелы в начале нужной строки — обычно это то, что надо. Если пробелы в начале строки важны, вместо него пишут cin.ignore(numeric_limits<streamsize>::max(), '\n'); (нужен #include <limits>) — пропустить всё до конца текущей строки включительно. Короткий вариант cin.ignore(); пропускает ровно один символ и не спасёт, если после числа есть пробел.

Все строки до конца ввода

C++
#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 line
Вывод
1: first line
2: second line
3: third line

while (getline(cin, line)) повторяется, пока строки есть; в конце ввода условие становится ложным. При вводе с клавиатуры конец ввода — Ctrl+D в Linux и macOS, Ctrl+Z и Enter в Windows.

Подводные камни