Строка - это линейно упорядоченная последовательность символов, принадлежащих конечному множеству символов, называемому алфавитом.
Строки обладают следующими важными свойствами:
· их длина, как правило, переменна, хотя алфавит фиксирован;
· обычно обращение к символам строки идет с какого-нибудь одного конца последовательности, т.е. важна упорядоченность этой последовательности, а не ее индексация; в связи с этим свойством строки часто называют также цепочками;
· чаще всего целью доступа к строке является не отдельный ее элемент (хотя это тоже не исключается), а некоторая цепочка символов в строке.
Говоря о строках, обычно имеют в виду текстовые строки - строки, состоящие из символов, входящих в алфавит какого-либо выбранного языка, цифр, знаков препинания и других служебных символов. Действительно, текстовая строка является наиболее универсальной формой представления любой информации: на сегодняшний день вся сумма информации, накопленной человечеством - от Ветхого Завета до нашего учебного пособия - представлена именно в виде текстовых строк. В наших дальнейших примерах этого раздела будем работать именно с текстовыми строками. Однако, следует иметь в виду, что символы, входящие в строку могут принадлежать любому алфавиту. Так, в языке PL/1, наряду с типом данных "символьная строка" - CHAR(n) - существует тип данных "битовая строка" - BIT(n). Битовые строки, составляются из 1-битовых символов, принадлежащих алфавиту: { 0, 1 }. Все строковые операции с равным успехом применимы как к символьным, так и к битовым строкам.
Кодирование символов было рассмотрено в главе 2. Отметим, что в зависимости от особенности задачи, свойств применяемого алфавита и представляемого им языка и свойств носителей информации могут применяться и другие способы кодирования символов. В современных вычислительных системах принята кодировка всего множества символов на разрядной сетке фиксированного размера (1 байт).
Рассмотрим три примера возможностей работы со строками.
Язык C является языком системного программирования, типы данных, с которыми работает язык C, максимально приближены к тем типам, с которыми работают машинные команды. Поскольку машинные команды не работают со строками, нет такого типа данных и в языке C. Строки в C представляются в виде массивов символов. Операции над строками могут быть выполнены как операции обработки массивов или же при помощи библиотечных (но не встроенных!) функций строковой обработки.
В языках универсального назначения обычно строковый тип является базовым в языке: STRING в PASCAL, CHAR(n) в PL/1. Основные операции над строками реализованы как простые операции или встроенные функции. Возможны также библиотеки, обеспечивающие расширенный набор строковых операций.
Тип
| Макс длина
| #0 в конце
| Используется для
|
ShortString
|
| Нет
| Для старых версий
|
AnsiString
| ~2^31 (2GB)
| Есть
| ANSI-символы
|
String
| 255/2GB
| Есть/нет
| ANSI/Unicode-символы
|
WideString
| ~2^30
| есть
| Unicode-символы; серверах COM и интерфейсах
|
PChar
|
| есть
|
|
По умолчанию {$H+}, компилятор интерпретирует String (когда она появляется без заключенного в скобки числа) как AnsiString с символом #0 на конце.
AnsiString, иногда называют длинной строкой, - предпочтительный тип для большинства целей. Типы String могут смешиваться в выражениях; компилятор автоматически выполняет необходимые преобразования.
Объявление длинной строки:
var
S: string;
Стандартная функция Length возвращает число символов в строке. Процедура SetLength устанавливает длину строки. Сравнение строк определяется упорядочением символов в соответствующей позиций.
Если S: string и i переменная целого типа, то S[i] представляет i-й символ в S. Для ShortString или AnsiString, S[i] - типа AnsiChar; для WideString, S[i] - типа WideChar. S[i]:= 'A’ назначают «А» для второго символа S. В следующем примере используется стандартная функция UpCase для того, чтобы преобразовать S в верхний регистр:
var
i: integer;
begin
for i:=1 to Length(s) do S[i] := UpCase(S[i]);
end;
q function UpperCase(const S: string): string; - возвращает строку, преобразуя ASCII символы 'a'..'z' в верхний регистр.
q function AnsiUpperCase(const S: string): string; - преобразовывает все символы строки в верхний регистр. Эта функция поддерживает мульти-байтовые символьные таблицы (MBCS).
q function StrUpper(Str: PChar): PChar; - преобразовывает Str в верхний регистр и возвращает Str.
Будьте осторожными с индексами строк, т.к. обращение к символу за концом строки может привести к ошибке. Можно назначить переменной string константы или любое другое выражение типа string. Длина строки изменяется динамически при присваивании. Примеры:
S := 'Петя!';
S := 'Hello, ' + 'Петя!';
S := ' '; { пробел }
S := ''; { пустая строка }
Короткая строка ShortString может содержать от 0 до 255 символов, занимая от 1 до 256 байтов памяти. Первый байт хранит длину строки. Если S - переменная типа ShortString, то Ord(S[0]), аналогично Length(S), возвращает длину S; изменение S[0], подобно SetLength, изменяет длину S. Короткие строки ShortString использую 1-байтовые символы ANSI и поддерживаются только для совместимости со старыми версиями.
Например,
var
S: string[100];
описывает переменную S, котора может содержать до 100 символов.