Строку почти всегда можно рассматривать как массив символов, то есть обращаться из программы к отдельным символам строки: s1[1], s2[1], txt[1][10] (в последнем случае имеется в виду десятый символ первой строки). Нумерация символов в строке всегда начинается с 1. Однако присваивание отдельным элементам строки конкретных символьных значений может не привести к желаемому результату. Чтобы понять, почему это иногда происходит, необходимо рассмотреть принципы организации строковых переменных в памяти компьютера. Дело в том, что для хранения любой строки отводится ровно на 1 байт больше, чем указано при ее описании (256 байт для строк, размерность которых не указана явно). Причем этот вспомогательный байт располагается в самом начале строки, фактически это ее нулевой байт. В нем хранится текущая реальная длина строки. Собственно говоря, такой механизм и накладывает максимальные ограничения на возможную длину строк в языке Паскаль, так как максимальное число, представимое в одном байте, равно 255. Значение этого байта автоматически изменяется программой при выполнении стандартных операций над строками: считывании, присваивании строковой переменной строкового выражения, обращении к стандартным процедурам и функциям, работающим со строковыми выражениями. Рассмотрим на примере, как меняется содержимое памяти и реальное значение строки при выполнении тех или иных операций:
Операция
| Содержимое памяти, выделенной строковой переменной s
| Значение s
|
var s: string[6];
| s[0]
| s[1]
| s[2]
| s[3]
| s[4]
| s[5]
| s[6]
|
|
s:=‘ ‘;
|
|
|
|
|
|
|
| ‘ ‘
|
s:=‘Yes’;
|
| Y
| e
| s
|
|
|
| ‘Yes’
|
s[4]:=‘!’;
|
| Y
| e
| s
| !
|
|
| ‘Yes’
|
s:=s+’No’;
|
| Y
| e
| s
| N
| o
|
| ‘YesNo’
|
s[4]:=‘!’;
|
| Y
| e
| s
| !
| o
|
| ‘Yes!o’
|
На этом примере можно понять, что операция присваивания значения элементу строки, индекс которого превосходит текущую длину строки, не является корректной и фактически не оказывает влияния на результат. Поэтому применения подобных конструкций при программировании следует избегать, стараясь обходить стандартными операциями над строками. Рассмотрим их подробнее.
В отличие от массивов, над строковыми переменными определены операции считывания и печати. К строкам применима операция сложения. При сложении двух строк концу первой из них приписывается вторая (по-другому эту операцию называют конкатенацией строк).
st 2:= ’a’ + ‘123’ + ‘b’; st 2:= ’a123b’;
|
Над строками между собой производится согласно так называемому лексикографическому порядку. Строка s 1 считается меньше строки s2, если существует такая позиция k, что s 1[1 ..k -1] = s 2[1.. k -1] и s 1[ k ]< s 2[ k ] или такой позиции не существует, но строка s 1 короче строки s 2. При операциях сравнения идет сравнение строк, начиная с левого края до первого несовпадающего символа. Например:
‘a 123 b’ <= ‘a’‘Дом’ = ‘Дом’‘Дом’ > ‘дом’
|
Пример. Покажем переменные, выражающие результат от строки ‘институт’.
a: string[4]; a:=’институт’ Þ a:=’инст’; b: string[8]; b:=’институт’ Þ b:=’институт’; с: string[15]; с:=’институт’ Þ с:=’институт…’;
|
В программе можно обратиться также и к определенному символу строки:
b:=’институт’; b [3]:=’с’;
|