zaLinux.ru

Как ввести в cin строки с пробелами в С++


По умолчанию 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

Смотрите также онлайн учебник «Основы С++».


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *