Программирование >>  Разработка устойчивых систем 

1 ... 22 23 24 [ 25 ] 26 27 28 ... 196


инициализация объекта string с помощью знака равенства (=);

использование объекта string для инициализации другого объекта.

: СОЗ:Small String.срр #include <str1ng> using namespace std:

int mainO { string imBlank:

string heyMom( Where are my socks? ): string standardReply = Beamed into deep

space on wide angle dispersion? : string useThlsOneAgain(standardReply): } III:-

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

использование подмножества символьного массива С или строкового объекта С++;

объединение нескольких источников инициализационных данных оператором +;

выделение подстроки функцией substr() объекта string. Следующая программа демонстрирует перечисленные возможности.

: C03:SmallStr1ng2.cpp #include <string> #include <1ostream> using namespace std:

int mainO { string si

( What is the sound of one clam napping? ): string s2

( Anything worth doing is worth overdoing. ): string s3( I saw Elvis in a UFO ): Копирование первых 8 символов string s4(sl. 0. 8): cout s4 endl:

Копирование 6 символов из середины источника

string s5(s2. 15. 6):

cout s5 endl:

Копирование из середины в конец

string s6(s3. 6. 15):

cout s6 endl:

Комбинированное копирование

string quoteMe = s4 + that +

substrO копирует 10 символов начиная с элемента 20 sl.substr(20. 10) + s5 +

substrO копирует 100 символов или остаток до конца строки, начиная с элемента 5. with + s3.substr(5. 100) +

Функция substrO также может копировать отдельные символы sl.substr(37. 1): cout quoteMe endl: } /:-



В первом аргументе функции substr() класса string передается начальная позиция, а во втором - длина подстроки в символах. У обоих аргументов имеются значения по умолчанию. Функция substr() с пустым списком аргументов возвращает копию всего объекта string; это удобный способ копирования строк С++.

Программа выводит следующий результат:

What is doing

Elvis in a UFO

What is that one clam doing with Elvis in a UFO?

Обратите внимание на последнюю строку примера. С++ позволяет объединять разные способы инициализации string в одной команде, что очень удобно. Также стоит заметить, что последний инициализатор копирует всего один символ из исходного объекта string.

Другая, более изощренная, методика инициализации основана на применении строковых итераторов string::begin() и string::end(). Строка интерпретируется как объект-контейнер, в котором начало и конец последовательности символов обозначаются при помощи итераторов (мы уже встречались с контейнерами на примере векторов, а в главе 7 будут рассмотрены и другие их разновидности). В этом варианте конструктору string передаются два итератора, и он копирует символы из одного объекта string в другой:

: СОЗ:Stringlterators.Срр #include <string> #include <iostream> #include <cassert> using namespace std;

int mainO {

string sourceCxxx ):

string s(source.begin(). source.endO):

assert(s == source): } /:-

Операторы с итераторами не ограничиваются вызовами begin() и end(). Итераторы можно увеличивать и уменьшать, а также прибавлять к ним целочисленные смещения, чтобы извлечь подмножество символов из исходной строки.

Строки С++ не могут инициализироваться одиночными символами, ASCH-кодами или другими целочисленными значениями. Впрочем, строка может инициализироваться несколькими экземплярами одного символа:

: C03:UhOh.cpp #include <string> #include <cassert> using namespace std:

int mainO {

Ошибка: инициализация одиночным символом недопустима ! string nothingDoingl(a):

Ошибка: инициализация целочисленными кодами недопустима ! string nothingDoing2(0x37): Следующий вариант допустим: string okay(5. а): assert(okay == stringCaaaaa )): } /:-



Операции со строками

Каждому программисту с опытом работы на С хорошо знакомы функции записи, поиска, модификации и копирования массивов char. У функций стандартной библиотеки С имеются два недостатка. Во-первых, они неформально делятся на две категории: простые функции и те, которым при вызове необходимо передать количество символов, участвующих в выполняемой операции. Список библиотечных функций С для работы с символьными массивами поражает неопытного пользователя: перед ним оказывается длинный перечень загадочных и неудобопроизносимых имен функций. Типы и количество аргументов у этих функций более или менее выдержаны, но для их правильного использования необходимо тщательно следить за именами и передачей параметров.

Однако у функций стандартной библиотеки С есть второй недостаток: все они подразумевают, что символьный массив завершается нуль-терминатором. Если нуль-символ по недосмотру или ошибке будет пропущен или перезаписан, ничто не помешает функциям символьных массивов С выйти за пределы строки. Результаты обычно оказываются катастрофическими.

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

Присоединение, вставка и конкатенация строк

Одно из самых ценных и удобных свойств строк С++ состоит в том, что они автоматически растут по мере надобности, не требуя вмешательства со стороны программиста. Работа со строками не только становится более надежной, из нее почти полностью устраняются нетворческие операции - отслеживание границ памяти, в которой хранятся данные строк. Например, если при создании строковый объект был инициализирован 50 экземплярами символа X , а позднее в нем были сохранены 50 экземпляров строки Zowie , объект сам выделит достаточный блок памяти в соответствии с увеличившимся объемом данных. Но в полной мере это свойство проявляется в ситуациях, когда обрабатываемые в программе строки изменяются в размерах, но вы не можете оценить эти изменения количественно. Строковые функции append() и insert:() автоматически перераспределяют память при увеличении строки:

: C03:StrSize.cpp #include <str1ng> #include <iostream> using namespace std;

int mainO {

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



1 ... 22 23 24 [ 25 ] 26 27 28 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика