Некоторой особой разновидностью одномерных символьных массивов являются специальные составные объекты Паскаля, называемые строками. Их частое использование и специальный набор процедур и функций, работающих со строками, позволяет выделить их в отдельный составной тип.
Строкой называется именованная последовательность символьных данных, расположенных в памяти ПЭВМ подряд. В некотором роде, строка является разновидностью одномерного символьного массива, но в отличие от массива, она внутри себя содержит сведения о текущей (заполненной) длине.
Значения строк в программе записываются в виде последовательности символов, заключенных в апострофы. Количество символов в строке может меняться от 0 до максимального, предусмотренного при выделении места под строку. Если при создании строки ее максимальная длина не оговаривается, она считается равной максимальному значению, равному 255 символов. Текущая длина строки хранится в виде однобайтного целого в нулевом байте строки. Поэтому в памяти ЭВМ строка занимает на 1 байт больше места, чем указано в ее максимальной длине.
Для того чтобы завести в программе строку, можно определить свой строчный тип или использовать стандартный описатель строки. По первому способу:
TYPE
str20 = string[20]; { ввели свой тип - строку из 20 символов }
. . .
VAR
Result, Error : str20; {отвели место под 2 строки, каждая по 20 символов, задали им имена }
По второму способу:
VAR
Name : string[20]; { создали строку длиной 20 символов с именем Name }
Переменной типа строка можно задавать значения (как и другим типам переменных) тремя различными способами.
Во-первых, значение может быть занесено в строку при ее создании. При этом может быть сформирована строка-константа:
CONST
HELLOW = ' Здравствуйте, я - вежливая программа! ';
или строка-переменная с заданным начальным значением:
CONST
Protocol : string[12] = 'RESULT.TXT';
В отличие от первого случая, содержимое строки Protocol в дальнейшем может быть изменено на другое, но не длиннее 12 символов.
Во-вторых, переменной типа строка может быть присвоено значение строчного выражения с помощью оператора присваивания:
VAR
St1,St2,St3 : string[30];
. . .
Begin
. . .
St1:='Пример '; {St1, St2 и St3 получают значения присваиванием }
St2:='строки';
St3:=St1+'новой '+St2; {в St3 окажется 'Пример новой строки'}
В-третьих переменная типа строка может быть заполнена операцией ввода:
VAR
St1:string[5];
St2:string;
. . .
Begin
. . .
writeln('Введите 1-ю строку');
readln(St1);
{ набираем последовательность символов АБВГДЕЖЗ <Enter> }
writeln('Введите 2-ю строку');
readln(St2);
Набираем последовательность символов 'АБВГ ДЕЖЗ" <Enter>, после таких действий переменная St1 будет содержать символы АБВГД, а переменная St2 - 'АБВГ ДЕЖЗ" Текущая длина St1 будет равна 5, St2 - 11 .
Из строковых данных можно строить строковые выражения, в которых в качестве операндов выступают строковые константы, переменные строковые функции и символьные данные. В этих выражениях можно применять операцию сцепления двух или более строк (конкатенации), обозначаемую символом '+'. Результатом будет новая строка (длиной не более 255 символов), содержащая первую строку за последним символом которой начинается вторая и так далее.
Для строк определены все 6 операций отношений. Строки сравниваются посимвольно, слева направо, как только встречается в одной строке символ с меньшим кодом, так эта строка признается за меньшую. Отсутствие символа (более короткая строка) при одинаковом начале определяет меньшую строку. Результат операции отношения - логическое значение. Например:
выражение отношения результат вычисления выражения
'A' < 'B' TRUE
'A ' < 'A' FALSE
'ABCD' < 'ACB' TRUE
Если значение строчного выражения превышает по длине максимальную длину переменной, при присваивании произойдет отбрасывание не влезающих (последних, правых) символов.
Как уже упоминалось выше, в выражении могут встречаться символьные переменные. Если символьной переменной присваивается строковое выражение, его значение должно в момент присваивания иметь длину = 1, иначе возникнет ошибка.
К отдельным символам строки можно обращаться по его номеру в строке. Для этого используется индексное выражение:
VAR St1,St2:string[6];
. . .
Begin
. . .
St1:='ПРИМЕР';
St2:='Вася';
writeln (St1[4]+St1[3]+St1[6]);оператор печати слова МИР
St1[0]:=St2[0];теперь строка St содержит слово ПРИМ
writeln('St1[0]=',Ord(St1[0]));так можно распечатать содержимое нулевой ячейки строки St1
Нулевой символ содержит текущую длину строки, его значение формируется автоматически, ему нельзя присваивать значение оператором присваивания (оператор st1[0]:=st2[0] сработает, но контроль длинны не выполнится, и последствия могут быть самыми печальными).
Для работы со строками в Турбо Паскале предусмотрено несколько стандартных процедур и функций, хранящихся в библиотеке с именем System.
Эта библиотека подключается к программе автоматически, поэтому ее можно не указывать в разделе описаний.