Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 59
Текст из файла (страница 59)
Константные строки символов сопровождают вывод результатов, а ввод и вывод всех типов данных часто производится с помощью строк. Разумеется, строки символов играют существенную роль во всех программах, работающих с символьными данными. 5.3.1. Вопросы разработки Ниже сформулированы два важнейших вопроса разработки, связанные с символьными строками. ° Должны ли строки быть просто особой разновидностью массива, состоящего из символов, или элементарным типом (без индексации, характерной для массивов)? ° Должны ли строки иметь статическую или динамическую длину? 5.3.2.
Строки и действия над ними Если строки не определены как элементарный тип, то строковые данные обычно хранятся в массивах, состоящих из отдельных символов, и ссылаться на них можно лишь как на элементы массивов. Такой подход принят в языках Рааса!, С, С++ и Ада. В языке Рааса), в котором строки не являются основным типом, массивам облак, имеющим атрибут рао)свс), могут присваиваться значения, и они могут сравниваться между собой с помощью операторов отношений. В языке Аоа тип ЯТК1и6 является встроенным и определяет одномерные массивы элементов, принадлежащих к типу СНАКАСТЕК. Для типов ЯТК1ИЯ прелусмотрены операции обращения к подстрокам, конкатенация, операторы отношений и присваивания.
Обращение к подстрокам позволяет интерпретировать любую подстроку данной строки как величину, на которую можно ссылаться, или переменную, которая может входить в оператор присваивания. Обращение к подстроке обозначается целочисленным лиапазоном, взятым в круглые скобки и указывающим расположение требуемых символов, Например, команда ИАИЕ1(2г4] задает подстроку, состоящую из второго, третьего и четвертою символа строки, являю- шейся значением переменной ИАИЕ1. Конкатенация строк символов в языке Ада является операцией, задаваемой символом Ь. Следующий оператор выполняет присоединение переменной иАИЕ2 к правому концу строки, являющейся значением переменной ЫАИЕ1: ИАИЕ1: = ИАИЕ1 Ь ИАИЕг ! 219 5.3. Символьныв строки Например.
если переменная ЫАМЕ1 содержит строку "РЕАСЕ", а переменная МАМЕ2— строку "РОЬ", то после операции присваивания переменная МАМЕ1 будет содержать строку "РЕАС ЕГО Ь'1 В языках С и С + лля хранения строк символов используются массивы сЬаг. а набор операций со строками предусмотрен в стандартной библиотеке с заголовочным файлом вг = Ьп9.
Ь. В большинстве операций со строками и в большинстве библиотечных функши1 подразумевается, что строки символов завершаются специальным символом: нулевым байтом, представляемым числом О. Это соглашение является альтернативой хранению длины строковых переменных. Библиотечные функции просто выполняют свои операции. пока не дойдут в обрабатываемой строке до нулевого байта. Библиотечные функции, создающие строки. сами вносят в них нулевой байт.
Литералы символьных строк. создаваемые компилятором, также содержат нулевой байт. Рассмотрим следующее объявление: сЬаг *вгг "арр1ев"; В этом примере вгг — указатель типа сЬаг, алресующий строку символов арр1евО, где 0 — символ нуля. Инициализация указателя вгг разрешена, поскольку литералы символьных строк представляются указателями типа сЬаг, а не собственно строкой.
Назовем некоторые широко распространенные библиотечные функции языков С и С++, выполняющие операции со строками символов. Это функция вггсру, перемещающая строки; вггсаг, конкатенирующая одну данную строку с другой; всгспр, выполняющая лексикографическое сравнение лвух заданных строк (по порядку их АЯСВ-кодов); функция вгг1еп, возвращающая число непустых символов данной строки.
Параметры и возвращаемые значения большинства функций обработки строки являются либо указателями типа сЬаг, адресуюшими массивы символов, либо строковыми литералами. В языках ЕОКТКАХ 77, РОКТКАХ 90 и ВАЫС строки интерпретируются как основные типы. и для них предусмотрены операции присваивания, конкатенации, ссылки на подстроки, а также операторы отношения. В языке Зача строки поддерживаются классом Ясг1п9 как элементарные типы, значения которых являются константными строками, и классом Ясг1п9ВиТТег, значения которого могут изменяться, и более всего похожи на массивы отдельных символов.
Использование подстрок разрешено для переменных класса Яг г1г19Вц Т Те г. Вообще, операции присваивания и сравнения символьных строк усложнены возможностью присваивания и сравнения операндов различных длин. Что произойдет, например, при присвоении более ллинной строки более короткой строке или наоборот? Обычно в таких ситуациях заранее принимаются простые и целесообразные решения, хотя пользователи часто сталкиваются с проблемами при их запоминании. Еше одной базовой операцией со строками символов является сопоставление с образцом. Часто она обеспечивается библиотечной функцией, а не операцией языка.
Существует два важных исключения, одним из которых является язык 5ХОВОЬ4, содержащий детально разработанную встроенную в язык операцию сопоставления с образцом. Этот язык, вероятно, предоставляет максимально полные возможности для работы со строками. Образцами строк в языке 5ХОВОЬч являются выражения, которые могут присваиваться переменным. Рассмотрим, например, следующий фрагмент программы: ЬЕТТЕК = 'аЬссеТдЬ171с1жпсрЧгвсиснхуг' НОКОРАТ = ВКЕАК(ЬЕТТЕК] ЯРАМ(ЬЕТТЕК1 . ЬОКО 220 Глава 5. Типы данных ЕЕТТЕК вЂ” это переменная. значением которой является строка из всех строчных букв. Ь1ОКОРАТ вЂ” это образец.
следующим образом описывающий слова; вначале пропускаются все символы, пока ие будет найдена буква. затем эти б> квы перебираются. пока не будет найден символ. не являющийся буквой. Образец также содержит оператор ".". указывающий на то. что строка. совпавшая с эталоном. присваивается переменной КОКО.
Этот образец может использоваться и в операторе ТЕХТ ЫОКОРАТ Такой оператор попытается найти строку букв в строковом значении переменной: ЕХ .. Вторым важным языком, содержащим встроенные опсрашш сопоставления с ооразцом, является язык Рег(. В этом случае выражения сопоставления с образцом отлазенно напоминают регулярные математические выражения.
(В действительности они часто и называются регулярными выражениями.) Оии произошли от раннего строчного редактора ес( операционной системы (Лч!Х и стали частью языков оболочек системы ОМХ. В конечном итоге самой сложной формой этих языков стал язык Рег1. Объяснение этих выражений довольно громоздко и занимает целую главу в книге по языку Рег). впрочем. стоит отметить, что уже существует книга, посвященная выражениям сопоставления с образцом (Гг!ед1, 1997). В данном разделе мы всего лишь кратко познакомимся со стилем выражений сопоставления с обрашом, использовав для этой цели лва относительно простых примера. Рассмотрим следующее выражение-образец: /(А-Еа-г)[А-Еа-г'~с)-/ Этот образец соответствует типичной форме имени в языках программирования (или описывает ее).
В квадратных скобках заключены классы символов. Первый класс залает все буквы: второй — все буквы и цифры (цифра задается сокрашением ~б). Если включить только второй класс, то л~ы не сможем запретить имена. начинающиеся с цифр. Знак "+", следующий за второй категорией. устанавливает. что в имени должно содержаться не менее одного символа. входящего в данную категорию.
Таким образом. весь эталон целиком соответствует строке, начинающейся с буквы. за которой следует не л1енее одной буквы или цифры. Рассмотрим слелуюшее выражение-образец: /М+' . РМ* ! 'х. 'хс(+/ Этот образец соответствует числовым константам. Символы ~ . залают точа) в десятичной записи числа. Вопросительный знак определяет число (О или 1) появлений того. что следует за ним.
Вертикальная черта ( ! ) разлеляет два альтернативных варианта всего образца. Первый вариант соответствует строкам с несколькими цифрами. за котор ми. возможно, следует десятичная точка. и цифры: вторая альтернатива соответств)ст сзрокам, начинающимся с десятичной точки. за которой следует не менее одной ш|фры. 5.3.3. Варианты длины строк Существует несколько проектных решений. касающихся ллины строковых величин. Во-первых.
длина может быть статической и залаваться в объявлении. Такая строка иа~ывается строкой со статической ллиной (кайс (епйгй ыппа). Подобные строки суше;гвуют в языках ГОКТКАХ 77, ГОКТКАХ 90. СОВОГО, Разса( и Аг(а. Например. слез) юший оператор языка РОКТКАХ 90 объявляет переменные нАХЕ и ЗАХЕ символьнями строками длины 15: 221 5.3.
Символьные строки ЕййРА .ЕК(ЕЕЗ = 151 ЫАМЕ1, ЫАМЕ2 Строки со статической длиной всегда полные; если строковой переменной присваивается строка меньшей длины. то своболные места заполняются символамн нуля. Второй альтернативой является наличие у строк перелзенной длины, ограничиваемой заданным при объявлении размером. как это сделано а языках С и С++. Подобные строки называются строками с ограниченной динамической длиной (11шйег( бупаш(с 1епфй ззг(пйз) и могут содержать любое количество символов, от нуля до максимального значения. Напомним.