Строку почти всегда можно рассматривать как массив символов, то есть обращаться из программы к отдельным символам строки: 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]:=’с’; |
st 2:= ’a123b’;






