По умолчанию cin (стандартный ввод) в С++ считывает данные до первого пробела. Рассмотрим способы, с помощью которых мы можем передать через стандартный ввод строку, содержащую один или нескольких пробелов, чтобы эта строка могла быть присвоена в качестве значения переменной в программе.
cin по умолчанию пропускает все белые пробелы (пробелы, табуляции, новые строки и т. д.). Вы можете либо изменить его поведение, либо использовать немного другой механизм.
Рассмотрим небольшую программу, которая просит пользователя ввести имя и после этого сразу же отображает введённую строку на экране. Приведённый код работает так, как ожидается, если вводимые данные не содержат пробелов:
#include <iostream> using namespace std; int main() { string line; cout << "Введите ваше имя: "; cin >> line; cout << "Ваше имя: " << line << endl; }
Для запуска этого кода сохраните его в файл test.cpp и скомпилируйте:
g++ test.cpp
Запуск скомпилированного файла:
./a.out
Попробуем ввести строку с пробелами:
Как можно увидеть, из введённой строки «Алексей Милосердов», сохранилось только часть до пробела, то есть «Алексей».
Чтение строки с getline
getline читает символы из входного потока и помещает их в строку — именно это нам и нужно. getline (как и использование строки), требует указать заголовок #include <string>. Отредактируем наш код:
#include <iostream> #include <string> using namespace std; int main() { string line; cout << "Введите ваше имя: "; getline(cin, line); cout << "Ваше имя: " << line << endl; }
Выполним проверку:
Как можно убедиться, теперь строка считалась полностью, вместе с пробелами.
Изменение поведения cin с помощью noskipws
Как мы уже выяснили, по умолчанию cin пропускает все белые пробелы (пробелы, табуляции, новые строки и т. д.). Чтобы изменить его поведение, используйте манипулятор noskipws следующим образом:
cin >> noskipws >> line;
noskipws включает пропуск начальных пробелов с помощью форматированных функций ввода (по умолчанию включено). Не влияет на вывод.
То есть noskipws не поможет нам передать через стандартный ввод строки, содержащие в себе пробелы, кроме тех случаев, когда пробелы стоят в начале строки.
Чтобы стало понятнее, рассмотрим следующий код:
#include <iostream> #include <sstream> using namespace std; int main() { char c1, c2, c3; istringstream("a b c") >> c1 >> c2 >> c3; cout << "Поведение по умолчанию: c1 = " << c1 << " c2 = " << c2 << " c3 = " << c3 << '\n'; istringstream("a b c") >> noskipws >> c1 >> c2 >> c3; cout << "Поведение с noskipws: c1 = " << c1 << " c2 = " << c2 << " c3 = " << c3 << '\n'; }
В результате работы этого кода будет выведено:
Поведение по умолчанию: c1 = a c2 = b c3 = c Поведение с noskipws: c1 = a c2 = c3 = b
Смотрите также онлайн учебник «Основы С++».
Связанные статьи:
- Сравнение char со строкой в C++ (81.8%)
- Почему в C++ для double в числе только 5 цифр после запятой (72.8%)
- Доступ к аргументам командной строки в C++ (72.8%)
- Как записать символы строки в обратном порядке (59.1%)
- Как в Bash проверить, содержит ли строка подстроку (59.1%)
- Ошибки git «Your local changes to the following files would be overwritten by merge» и «Please commit your changes or stash them before you merge» (РЕШЕНО) (RANDOM - 50%)