Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции / Ввод и вывод строк

.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
16.23 Кб
Скачать

Ввод и вывод строк

//Инициализация во время объявления

string myStr("Это первая строка.");

//Объявление с присваиванием

string myStr = "Это вторая строка.";

//Копирование другой строки (копирующий конструктор)

string myStr(other_Str);

//Создает строку из содержимого строки с завершающим нулем

string myStr(chart_Str);

//Тоже, но определнный длины count

string myStr(chart_Str, count);

//Заполнить count символами ch

string myStr(count, ch);

//Копировать из диапазона [pos, pos+count)

string myStr(othe_Str, pos, count);

//Создание строки с содержимым диапазона [first, last),

//где first и last - InputIterator

string myStr(first, last);

Ниже демонстрируется использование некоторых способов инициализации.

Программа

#include <iostream>

#include <string>

using namespace std;

int main() {

// Получаем C-строку

char S1[] = "Aliena vitia in oculis habemus, a tergo nostra sunt";

//Получаем объект string

string S2(S1, 13, 9);

cout << "S2 => " << S2 << endl;

string S3(S1);

// Получаем итераторы для S3

auto first = S3.begin();

auto last = S3.end();

string S4(first + 13, last - 4);

cout << "S4 => " << S4 << endl;

return 0;

}

S2 => in oculis

S4 => in oculis habemus, a tergo nostra

Примечание. Отдельным символом строку инициализировать нельзя!

Ввод и вывод объектов класса string. Функция getline

Для ввода/вывода строки используются глобальные потоковые объекты cin и cout и операции >> и <<, соответственно.

Если установлен флаг skipws начальные пробелы будут проигнорированы.

В поток будут поступать символы, пока не будет встречен пробельный символ (к ним относятся следующие: собственно пробел, \t, \v, \r, \n и \f) или EOF.

В программе пробельный символ будет расцениваться как нулевое значение (т. е. конец строки) и в строковую переменную будет записана только часть строки, до первого пробела, остальная часть останется на очереди - в потоке.

Такую строку получает переменная myStr в программе 4 (показано на выводе). Произвести сцепку оставшихся слов в потоке можно циклом while. (Смотрите ниже).

Программа

#include <iostream>

#include <string>

using namespace std;

int main() {

string myStr;

cout << "Введите строку состоящую\n"

"из нескольких слов,\n"

"разделенных пробелами:\n";

cin >> myStr;

cout << myStr << endl;

string S;

while (!cin.eof() && cin.get() != '\n') {

cin >> S;

myStr += ' ' + S;

}

cout << myStr << endl;

return 0;

}

//Один два три

Один

Один два три

Чтобы ввести строку полностью, включая пробельные символы, необходимо использовать функцию getline().

Примечание. Не путайте эту глобальную функцию класса string с функцией cin.getline() (методом класса istream), которая обычно применяется для C-строки.

Синтаксис этой функции таков:

getline (istream& is, string& str, char_delim);

Аргументы функции:

is - потоковый объект ввода;

str - объект класса string, куда будет помещена строка;

char_delim - третий аргумент (необязательный) используется для указания завершающего символа. Если третьего аргумента нет, то предполагается, что завершающий символ — '\n'.

Функция считывает строку полностью с завершающим символом. Сам символ новой строки отбрасывается и в строковой переменной не сохраняется.

Также не добавляется нулевой символ. Символ новой строки завершает выполнение функции, где бы он не находился.

Если нулевой символ находится в начале строки, то функция вернет пустую строку. Рассмотрим этот случай:

Программа

#include <iostream>

#include <string>

using namespace std;

int main() {

string S1, S2;

cout << "Введите строку S1\n";

getline(cin, S1);

cout << "#1 " << S1 << endl;

char ch[3];

cout << "ch = "; cin >> ch;

cout << "Введите строку S2\n";

//cin.ignore();

getline(cin, S2);

cout << ch << " " << S2 << endl;

return 0;

}

Введите строку S1

//Это первая строка

#1 Это первая строка

ch = #2

Введите строку S2

#2

После выполнения инструкции: getline(cin, S2); и вывода C-строки программа выводит пустую строку и завершает свою работу.

Причина того, что getline не приняла новую строку в том, что поток ввода оказался не пуст! После ввода С-строки (ch) в потоке остается завершающий символ (после выполнения операции ввода), этот символ и перехватила функция getline. Для очистки потока можно применить функцию cin.ignore() (или cin.get()).