Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 61
Текст из файла (страница 61)
Однако имеется соглашение, по которому за последним символом строки помещается нуль-символ (~0). Транслятор С добавляет нуль-символ в ко- нец каждой строковой константы. Например, и конец строки «В конце этой строки стоит нуль-символ> при компиляции будет добавлен нуль-символ, тоесть при раз- мещении символов строки в массиь" в него будет добавлен еше один элемент, со- держаший нуль-символ.
Однако если строка составляется из элементов массива, содержа>цих символ ы, яви ым образом, то программист должен сам добавлять нуль- символ в качсстве послелнего символа строки. Первых два способа представления символьных строк позволя>от отвести под каждый об ьскт этого типа определенный участок памяти еще при компиляции. Если же длина строк пе ограничена, требуется динамически распределять память для та- ких объектов уже в процессе выполнения программы.
Разные способы представле- ния строк предполагают и разные лопустимые операции работы с этими объектами. Существует множество разнообразных операций, применяемых к строкам. Не- которые наиболее важные операции перечислены ниже. 1. Конкатенация (объединение). Конкатенация — это операция, объединяющая две строки в одну длинную. Например, если знак ( ( обозначает конкатенацин>, то результатом выполнения операции "ВЕСЕК" ( / "НЕА0" будет строка "ВЕОЕКНЕА0" >, Болван.
— >>»ичеч. лчвс р«д. 218 Глава 5. Элементарные типы данных 2. Операции о>ппошеиий со строками. К строкам можно применять обычные опе- рации отношения (равно, больее-чев, веньке-чек), Как сказано в разде>лс 5.2А, базовое множество символ<>в упорядочено при помощи схемы сортировки. Эту схему можно применить и к строкам, в результате чего получится правило лексикографического (алфавитсого) упорядочения: строка А меньше строки В (то есть предшествует строке В), если первый символ в А меньше первого символа в В; если эти символы совпадают, то второй символ А меньше второго символа В и т. д. При этом иногда, если одна из сравниваемых строк длиннее, вторая удлиняется при помощи пробелов, чтобы их длины были одинаковыми.
3. Выбор поде>проки при помощи певиц>генного индекса. Обработка строковых данных часто вклгочает в себя выделение нз строки непрерывной подстроки. Например, строка может начинаться с некоторого количества пробелов или содержать слона, разделенш >с пробелами и знаками препинания. Для облегчения работы с подстроками во многих языках предусмотрена операция, позволяюп1ая выделить подстроку по указанным позициям ее первого и последнего символа в исходной строке пли по позиции первого символа и длине выделяемой подстроки. Например, оператор языка ЕОКТКА>ьг'ЛЕХТ - БТк(б: 101 присваивает переменной йЕХТ подстроку, состоящую из пяти символов строки 5Тк с шестого по десятый включительно.
Слгысл операции выбора подстроки иногда неочевиден, особенно если разрешено ее использовать с обеих сторон от символа операции присваивания (то есть соответствующая ей функция может возвращать как г-значсние, так н рзпачсние выделешгой подстроки, что позволяет присвоить выбрашюй подстроке новое значение). Рассмотрим следующее выражение языка ЕОКТКАН: 5ТЯ11 51 = 5ТЩ1 1+41 которое может быть использовано для того, чтобы передвинуть подстроку, которая начинается с позиции! и имеет длину 5, па место первых пяти позиций этой жс строки.
Если подстроки, которые задействованы в этом выражении, перекрываются, то требуется болыпая аккуратность в определении смысла этой операции. 4. Форма>пирование ввода-выводи. Исходное назначение операций пад строка- ми символов — помощь в форматировании данных для вывода или в разбиении форматированных данных ввода на более мелкие компоненты. В языках ЕО КТ КАК и С, например, предусмотрено большое количество операций, преследуюгцих эти цели. 5. Выбор подстроки на основе гопостпавления с образцом. Часто бывает так, что точная позиция требуемой подстроки неизвестна, но известно се положение по отношению к другим подстрокам. Например, возможно, мы захотим получить первый отличный от пробела символ строки, или последовательность символов после десятичной точки, или слово, следующее за слоном ТНЕ.
Опер щия сопоставления с образцом использует в качестве аргумента образепв специальную структуру данных, определян>щую вид искомой подстроки (например, ее длину или то, что она состоит из последовательности десятичных пифр), и, возможно, дру~ие подстроки, примыкающие к искомой (например, десятичная точка после искомой полстроки или последовательность 5.3.
Составные типы данных 219 предшествующих ей пробелов). Вторым аргументом операции сопоставления с образцом является сама строка символов, и которой будет производиться поиск требуемой подстроки, соответствующей заданному образцу, Мы уже встречались с операцией сопоставления с образцом и нашем обзоре языка Рег!, когда рассматривали регулярныс выражения (см. раздел 3,3.3). 6. Динамические строки. Значения строк могут быть как статическими, так и динамическими. Рог! является примером языка, и котором допускаются оба варианта. Строка 'САВВ' статическая, и оператор рт пс ' 1АВС ', цапсчатаст значение этой строки, то есть 1АВС.
Но строка "ТАВС" динамическая, и в результате выполнения оператора ргрпт "ЗАВС". сначала будет вычислено значение строки, которое равно значению строковой переменной 1АВГ, а потом оно уже будет напечатано'. Неограниченная длина, но содержимое размещается в блоках фиксированной длины Фиксированная длина Строки хранятся Строки хранятся Ш 10 и Е по 4 символа в слове с заполнением пробелами оставшихся А Т ! Н свободными байтов хранится в ее начале в блоках фиксированной длины — в одном слове содержится 4 символа, оставшиеся свободными позиции заполняются и абелами Т 1,Н Тгу,' р Переменная длина, ограниченная сверху Текущая нмаксимальная длины строки хранятся в начале строки Неограниченная длина,но содержимое размещается в блоках переменной длины Строка хранится как непрерывный массне символов.
Заканчивается нуль-сиыволоы Рис. 5.5. Представление строк а памяти Реализация. Каждый из трех описанных иышс способов представления символьных строк по-своему решщзустся и памяти компьютера, как показано на рпс. 5 5. Представление и памяти отдельных символов обсуждается и разделе 5 2 4. Предш вил си не для строк фиксированной длины имеет существенное значение, так как служит основой для храцсппя упакованного вектора символов (полробпее см. раздел 6.1.5), г(ля строк перемен пой длины с заданной максимальной длиной пред- В Ргп спинозы с срок а олннарных кавычках трак~ухгтся так, как онн а ~~ай запалы, ~огла как строки а авайаых кавычках — всего ашш, болг с упобная занять опара~гни шмгтанонкн в строку символов зпачспнн гкалнрных нсргьггннех н нгргнснных чаггтгвов.
— Примеч. науч ргд 220 Глава 5. Элементарные типы данных ставлеиие использует дескриптор, указываю<ций максимальную и фактическую длину строки, содержащейся в данном объекте. Дчя представлеиия неограничениых по длиис строк может использоваться либо связаи лая цепочка объектов дав иых фиксированной длины, либо непрерывный массив символов, Второй из уяомяиутых способов исцользустся в языке С и часто требует динамического управления ресурсами памяти во время выполнения программы. Обычно аппаратная часть поддерживает только самое простое представлецис— строки фиксированной длины, а для реализации остальных способов требуется црограммиое моделирование. Такие операции иад строками, как коикатецация, выбор подстроки и согюставлеиис с образцом обычно требуют полного программного модслироваиия.
5.3.2. Указатели и объекты данных, конструируемые программистом Обычно имое<о того, чтобы вкл<очагь в оцрсдслсиис языка множество различиых связанных объектов дал вых переменного размера, разработчики языка и рсдусматривают во<>можиос> ь конструирования пр<я<звольцых структур при помощи указателей, связывая>щих вместе компоненты структуры, представлеш<ые разнообразными объектами дацць>х.
Для этого язык должен црсдоставля и некоторые сцсциальиые возможности. В Элементарный тил даицых указатель (этот тип также иазывается ссылочлым). Объект данных указатель содержит ссылку иа мсстоцоложецие другого объекта данных (то сеть его йзиачсиис) или может солержать также цусгой указатель(обычно обозначаемый щ1 или ли<1). Указатели — втообычиые объекты лап цых, которые мо< ут быть как п рос гыми ц среме иль< ми, так и компонентами массивов и записей, 2. Олериция создалия объектов даццых фиксироваииого размера, таких как массивы, зашюи и злсмситарцыс объскгы.