<<
>>

Строки символов

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

В языках программирования строки представляются или в виде отдельного элементарного типа, или в виде массивов из элементов символьного типа. Различают три разновидности строк:

1) строки фиксированной длины (строки со статической длиной);

2) строки переменной длины, не превосходящей заданного максимума (строки с ограниченной динамической длиной);

3) неограниченные по длине строки (строки с неограниченной динамической длиной).

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

Объявление строковой переменной фиксированной длины вводит следующие правила:

? значениями могут быть строки символов только этой длины;

? присваивание строки символов с длиной, отличной от заданной, приводит к ее усечению (если длина больше заданной) или к добавлению пробелов в ее конец (если длина меньше заданной).

К данной разновидности относятся строки в языке Python, неизменяемые объекты класса String в Java, а также строковые классы из стандартной библиотеки классов C++, встроенный класс String в Ruby, средства из библиотеки классов .NET, доступные в языках C# и F#.

Правила работы со строками с ограниченной динамической длиной имеют вид:

1) в программе указывается максимальная длина строки;

2) фактические строки могут иметь меньшее количество символов;

3) текущая длина строки может меняться, но при превышении максимума лишние символы отсекаются.

262

Глава 10.
Составные типы данных

Подобные строки приняты в языках C и C++ (строки в стиле C). Правда, вместо объявления длины строки здесь используется ограничивающий нуль-символ \0, который помещается за последним символом строки.

При обработке строк с неограниченной динамической длиной обеспечивается максимальная гибкость, но существенно возрастают затраты на их динамическое размещение в памяти, а также на удаление из памяти. Такие строки применяют в JavaScript, Perl и стандартной библиотеке C++.

Язык Ada поддерживает все три разновидности строк.

Рис. 10.4. Размещение строк в памяти

Каждая из трех разновидностей строк по-своему размещается в памяти компьютера (рис. 10.4). Для строк с ограниченной динамической длиной дескриптор описывает максимальную и фактическую длину строки, находящейся в объекте данных. Строки с неограниченной динамической длиной содержатся или в связанной цепочке объектов фиксированной длины, или в непрерывном массиве символов. Непрерывные массивы часто применяют в языке С++.

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

Конкатенация (объединение). Конкатенацией называют операцию, объединяющую две короткие строки в одну более длинную. Например, если символ & обо

Строки символов

263

значает конкатенацию, то выполнение операции "Язык " & "программирования" приведет к строке "Язык программирования".

Операции отношений над строками. К строкам можно применять обычные операции отношения: равно, больше-чем, меньше-чем. Применительно к строкам, алгоритмы выполнения этих операций основываются на правиле лексикографического (алфавитного) упорядочения символов: строка Х меньше строки У, если первый символ в Х меньше первого символа в У; если эти символы совпадают, то второй символ Х должен быть меньше второго символа У. Этот процесс распространяется на все символы строк. Если же одна из сравниваемых строк длиннее, то вторую строку удлиняют за счет пробелов так, чтобы их длины стали одинаковыми.

Выделение подстроки при помощи индексов. В этом случае предполагается, что строка представляется как символьный массив. Результатом операции становится набор символов, позиции которых указаны индексами, являющимися аргументами операции: первый индекс задает первую позицию, а второй — последнюю позицию подстроки. Например, в языке Ada имеется встроенный тип String, который определяет строки как одномерные массивы элементов, принадлежащих к типу Character. Объявление этого типа имеет вид: type String is array (Positive range ) of Character;

где указано, что индексами могут быть положительные целые числа (типа Positive), а диапазон индексов не ограничен (об этом говорит фраза range ).

Для типа String предусмотрены: операция выделения подстроки, конкатенация, операции отношений и присваивание.

Объявим две строки, состоящие из 5-ти и 9-ти символов (для 9-символьной строки определим начальное значение):

Alias : String ( 1 .. 5 );

Name : String ( 1 .. 9 ) := "Aleksandr";

Теперь мы можем выделить пять символов из строки Name и присвоить их строке Alias, в результате чего она получит значение "Aleks":

Alias := Name ( 1 .. 5 );

Выделение подстроки на основе сопоставления с образцом. Иногда точная позиция требуемой подстроки неизвестна, но известны какие-то характеристики подстроки. Например, она располагается после символа 'a', или после десятичной точки, или после фразы "Пароль".

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

Правила создания регулярного выражения:

1. Регулярными выражениями являются отдельные терминальные символы.

2. Если а и b — регулярные выражения, то avb, ab, (a) и а* также являются регулярными выражениями.

3. Заключение регулярного выражения в круглые скобки приводит к созданию

группы, к которой можно применить другие операции, перечисленные в пункте 2.

264

Глава 10. Составные типы данных

Здесь обозначено:

? аЬ — результат конкатенации, или объединения, в последовательность регулярных выражений а и Ь;

? ауЬ — выбор одного из выражений а или Ь;

? а* — замыкание Клини регулярного выражения а (символ «*» обозначает операцию итерации), которым является ноль или более повторений регулярного выражения а. Примеры: пустая строка, а, аа, ааа,... и т. д.

ПРИМЕЧАНИЕ --------------------------------------------------------------------------------------------------

На практике вводят дополнительные соглашения по записи регулярных выражений. Например, используют запись р+ для сокращенного обозначения выражения рр*. Операцию «+» называют позитивным замыканием или усеченной итерацией.

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

Кроме описанных операций над строками, как правило, определяется большое количество операций форматирования. Они обеспечивают форматирование строк при выполнении ввода-вывода.

В языках С и C++ для хранения строк символов используются массивы с элементами типа char, а набор операций со строками предусмотрен в стандартной библиотеке языка С. Библиотечные функции, создающие строки, сами вносят в них ограничивающий нуль-символ \0. Рассмотрим следующее объявление: char area[] = "world";

Здесь создан массив area из шести символьных элементов, причем последним элементом является нуль-символ \0. Кроме воспроизводства C-строк, язык C++ дополнительно поддерживает строки с помощью своей стандартной библиотеки классов. Обычно программисты на C++ предпочитают работать со строками с помощью библиотечного класса string, не прибегая к символьным массивам и библиотеке языка C.

В языке Java строки поддерживаются классом String, обеспечивающим константные строки, и классом StringBuffer, ориентированным на изменяющиеся строки, более похожие на массивы отдельных символов. Такие строки формируются методами класса StringBuffer. Языки C# и Ruby содержат строковые классы, подобные классам Java.

В языке Python все строки принадлежат к элементарному типу с операциями выделения подстрок, конкатенации, индексированного доступа к отдельным символам, а также методами для поиска и замещения. Имеется также операция проверки принадлежности символа к некоторой строке. Таким образом, несмотря на то что строки в Python принадлежат к элементарному типу, в отношении поиска и выделения подстрок они очень похожи на массивы символов. Тем не менее строки в языке Python считаются неизменяемыми, подобно объектам класса String из языка Java.

Записи

265

В языке F# строка — это класс. Отдельные символы, представляемые в Unicode UTF-16, могут быть доступны, но не изменены. Строки могут подвергаться конкатенации с помощью операции +. В языке ML строка принадлежит к элементарному неизменяемому типу. Здесь предлагается операция конкатенации, обозначаемая значком (Л), а также функции для выделения подстроки и определения размера строки.

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

Возможности сопоставления с образцом (на основе регулярных выражений) представляются средствами библиотек классов для языков C++, Java, Python, C# и F#.

<< | >>

Еще по теме Строки символов:

  1. СИМВОЛ
  2. § 12. Государственные символы и столица
  3. СИМВОЛЫ ПЛАHЕТ
  4. ЧЕТЫРЕ ВЕЛИКИЕ СИМВОЛЫ
  5. Тема П.Строки. Позовна давність
  6. СТРОКИ ПСИХОМАТРИЦЫ
  7. Статья 338. Надругательство над государственными символами
  8. § 13. Права на звания, степени, знаки, награды, призы, символы (п. 1735-1738)
  9. ВЛИЯНИЕ ТРЕТИХ СТРОК НА СТАБИЛЬНОСТЬ СЕМЬИ
  10. ОЧЕРК ТРЕТИЙ Л.В.КАРАСЕВ И ДРУГИЕ: СМЕХ КАК СИМВОЛ
  11. СОВМЕСТИМОСТЬ ПО СИЛЕ СТРОК
  12. ВЛИЯНИЕ ВТОРЫХ СТРОК НА СТАБИЛЬНОСТЬ СЕМЬИ
  13. Чтение между строк
  14. ЗНАЧЕНИЕ ПЕРВОЙ СТРОКИ ПСИХОМАТРИЦЫ
  15. ВЛИЯНИЕ ПЕРВЫХ СТРОК НА СТАБИЛЬНОСТЬ СЕМЬИ
  16. ЗНАЧЕНИЕ ВТОРОЙ СТРОКИ ПСИХОМАТРИЦЫ
  17. Тема П.Строки. Позовна давність
  18. ЗНАЧЕНИЕ ТРЕТЬЕЙ СТРОКИ ПСИХОМАТРИЦЫ