C++ Программирование в среде С++ Builder 5

         

Функции строк


Класс string (точнее, basic_string) имеет богатый набор функций, выполняющих обработку строк. Мы расскажем только о некоторых.

Присваивание и присоединение

Функции assign () и append () делают в общем-то то же, что и операции присваивания и сложения, однако обладают большими возможностями благодаря дополнительным параметрам. Можно, например, скопировать из одной строки в другую определенное количество символов, начиная с некоторой позиции:

string si("Some String already exists."), s2;

s2.assign (si, 5, 6); // Скопирует только слово "String".

Функции assign () и append () имеют аналогичные перегруженные формы и различаются только тем, что первая полностью заменяет текущее содержимое строки новым текстом, а вторая дописывает тот же текст в конец строки. Приведем все имеющиеся формы этих функций, чтобы дать читателю представление о том, что там вообще есть (возвращаемый тип пропущен — все они возвращают basic_string&):

append (const basic strings s);

append (const. basic_string& s, size type pos, size_type npos);

append (const charT* s, size type n);

append (const charT* s);

append (size_type n, charT с );

append (Inputlterator first, Inputlterator last);

assign (const basic strings s);

assign (const basic_string& s,



size__type pos, size_type n);

assign (const charT* s, size type n);

assign (const charT* s);

assign (size_type n, charT с);

assign (Inputlterator first, Inputlterator last);

Вставка и удаление

Функции insert () и erase () производят соответственно вставку указанного текста в заданное место строки и удаление фрагмента строки. Третья функция, replace (), является их комбинацией: делается вставка, а затем часть старого содержимого строки удаляется.

Приведем всего один пример, простейший:

string s1 ("First string.");

string s2(" and second");

si.insert(s1.find(' '),s2);

В данном случае insert () вставляет содержимое второй строки в первую перед найденным в ней пробелом. Следующий оператор удалит только что вставленную строку:


sl.erase(sl.find(' '), 11);

Есть восемь перегруженных вариантов функции insert () и десять вариантов replace () . Для erase () , правда, имеются всего три формы. Все это при желании читатель может найти в оперативной справке С++Вuilder.



Поиск в строках



Функции семейства поиска очень разнообразны. Различные разновидности их еще и перегружены, так что общее число доходит до двух десятков. Функции семейства могут выполнять следующие операции.

Функция find () наиболее проста; она ищет первое вхождение строки, строки С или одиночного символа, начиная с указанного места, по умолчанию от начала, и возвращает позицию найденного фрагмента:

int i = s1.find("and");



Если указанный элемент текста не найден, функции поиска возвращают -1. Правда, возвращаемое ими значение имеет, по-видимому, беззнаковый тип (у меня не было желания в этом разбираться); во всяком случае, если это значение выводить на терминал без приведений, печатается беззнаковый эквивалент минус единицы.

Функция find_first_of () ищет первое вхождение в строку символа из указанного набора. По умолчанию поиск начинается от начала.

Функция find first not of() ищет первое вхождение символа, не входящего в указанный набор.

Функции find_last_of() и find_last_not_of() работают аналогично двум предыдущим функциям, но поиск начинается по умолчанию с конца строки и идет в направлении к ее началу.

Вот простейший пример подобного поиска:

string s("13:30:00 11/03/2000");

int k=0;

k=s.find_first_of(" :/",k) ;

Обычно эти функции используются для поиска разделителей или пропуска незначащих символов при синтаксическом разборе строк.



Преобразование в строки С



Две эквивалентных функции c_str () и data () возвращают константный указатель на строку, ограниченную нулем. Получив такой указатель и, возможно, скопировав содержимое стандартной строки средствами библиотеки С, можно затем работать со строкой, так сказать, в стиле языка С.

Можно также сразу скопировать содержимое строки (или его часть, что бывает удобно) в символьный буфер функцией copy ():







char buf[40];

string s = "abcdefghijklmnopqrstuvwxyz";

s.copy(buf 10 3);

buf[10]='\0';

Этот фрагмент копирует 10 символов из строки s в символьный буфер, начиная с 3-й позиции (т. е. с буквы d). Функция copy (), правда, не записывает в буфер конечный нуль, так что его приходится добавлять вручную.



Заключение



В этой главе вы познакомились с библиотекой стандартных шаблонов, то есть с контейнерами, строками и всем, что с ними связано — итераторами, функциональными объектами и т. п. Сила стандартных контейнеров в том, что они представляют собой готовые динамические структуры данных, которые сами следят за выделением и удалением памяти под свои данные. Программисту остается только грамотно написать базовый класс для хранящихся в контейнере объектов, снабдив его необходимыми конструкторами, деструкторами и перегруженными операциями. Все остальное сделает контейнер, обеспечив поддержание корректности структуры данных в процессе работы программы.


Содержание раздела