|
Программирование >> Операторы преобразования типа
while Cbegldx != string::npos) { ) Первая команда внутреннего цикла ищет конец текущего слова: endldx - 11ne.find f1rst of (dellms. begldx): Функция find first of() ищет первое вхождение одного из символов, составляющих первый аргумент. Необязательный второй аргумент определяет позицию, с которой начинается поиск. В нашем случае он начинается за началом слова. Если символ не найден, конец слова совпадает с концом строки: 1f (endldx string::npos) { endldx = line.lengthO: Количество символов определяется при помощи функции length(), которая для строк эквивалентна функции size(). В следующей команде все символы слова выводятся в обратном порядке: for (int i endldx-l: 1>=stat1c cast<int>(begldx): --1) { cout 11ne[i]; Для обращения к отдельным символам строки используется оператор []. Помните, что этот оператор не проверяет действрггельность индекса. Это означает, что вы должны сами заранее убедиться в правильности индекса (как это сделано в нашем примере). Более безопасный способ обращения к символам основан на применении функции at(). Лишние проверки замедляют работу программы, поэтому обычно при обращении к символам указанная проверка не предусмотрена. С индексами строк связана и другая неприятная проблема. Если забыть о приведении типа begldx к типу int, возможно зацикливание или аварийное завершение программы. Как и в первом примере, это объясняется тем, что string::size type является беззнаковым целым типом. Без преобразования типа знаковое значение i автоматически преобразуется в беззнаковое значение из-за сравнения с другим беззнаковым значением. В этом случае выражение i>=begldx всегда равно true, если текущее слово начинается с начала строки. Дело в том, что переменная begldx в этом случае равна О, а любое беззнаковое значение всегда больше либо равно нулю. Программа зацикливается и прерывается только в результате сбоя при нарушении защиты памяти. По этой причине автор старается избегать применения конструкций string: :slze type и string::npos. На с. 478 описано более безопасное (хотя и не идеальное) обходное решение. Последняя команда внутреннего цикла переводит begldx к началу следующего слова, если его удается найти: begldx = l1ne.find first not of (delims. endldx): В отличие от первого вызова функции find fir5tLnot of() поиск начинается от конца предыдущего слова. Если предыдущее слово завершалось в конце строки, то endldx содержит индекс конца строки. В этом случае поиск начнется от конца строки и вернет string; :npos. Попробуем запустить эту полезную и нужную* программу для следующих входных данных; pots & pans I saw a reed Результат выглядит так: stop & snap I was a deer Описание строковых классов Строковые типы Все строковые типы и функции определяются в заголовочном файле <string>: #1nclude <str1ng> Как обычно, все идентификаторы принадлежат пространству имен std. Шаблонный класс basic string В файле <string> определяется базовый шаблон для всех строковых типов basic string: namespace std ( tempiate<class charT. class traits = char tra1ts<charT>. class Allocator = allocator<charT> > class bas1c str1ng; Шаблон параметризуется по типу символов, трактовкам символьного типа и модели памяти. О Первый параметр определяет тип данных отдельного символа. О Необязательный второй параметр определяет класс трактовок, описывающих основные операции с символами строкового класса. В частности, класс трактовок задает способ копирования и сравнения символов (за подробностями обращайтесь на с. 659). Если класс трактовок не указан, используется класс трактовок по умолчанию для указанного типа символов. Пример пользовательского класса трактовок, позволяющего обрабатывать строки без учета регистра символов, приведен на с. 485. О Третий необязательный аргумент определяет модель распределения памяти, используемую строковым классом. Как обычно, по умолчанию задействуется модель allocator (за подробностями обращайтесь на с. 49 и к главе 15)*. В системах, не поддерживающих параметры шаблонов по умолчанию, третий аргумент обычно отсутствует.
Типы string и wstring Стандартная библиотека С++ содержит две специализированные версии класса basic string<>. О string - специализированная версия шаблона для символов типа char: namespace std { typedef bas1c string<char> string: О wstring - специа.1изнрованная версия шаблона для символов типа wchar t: namespace std { typedef bas1c str1ng<wchar t> wstring; Эта версия позволяет работать со строками, содержащими символы в многобайтовой кодировке (например, в кодировке Unicode или в азиатских кодировках - проблемы интернационализации рассматриваются в главе 14). В данной главе эти два типа строк не различаются. Принципы использования и возникаютцие проблемы остаются одинаковыми, поскольку все строковые классы обладают одинаковым интерфейсом. Таким образом, строка в данном контексте означает любой строковый тип, включая string и wstring. В приводимых примерах обычно используется тип string, потому что программы, как правило, пишутся в расчете на европейскую и англо-американскую языковую среду. )перации со строками в табл. 11.1 перечислены все операции, определенные для строк. Таблица 11.1. Операции со строками Операция Описание
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |