Действия с символами

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: