При описании параметров производным строковым типом нельзя конструировать типы в описаниях процедур (функций). Например, объявление
FUNCTION Xstr( S : String[32] ) : String[6];
совершенно неправильно. Корректно оно выглядит таким образом:
TYPE
String32 = String[32];
String6 = String[6];
...
FUNCTION Xstr( S : String32 ) : String6;
Можно, вообще говоря, рассматривать строки как массив символов. Турбо Паскаль разрешает такую трактовку, и любой символ в строке можно изъять по его номеру (рис. 8.1).
| VAR
| > i : Byte;
| > S : String[20];
| BEGIN
| > S := 'Массив символов.....';
| >for i:=1 to 20 do WriteLn( S[i]);
| > ReadLn {Пауза до нажатия клавиши ввода}
| END.
Рис. 8.1
Отдельный символ совместим по типу со значением Char. Иными словами, можно совершать присваивания, представленные на рис. 8.2.
Каждая строка всегда «знает», сколько символов в ней содержится в данный момент. Символ S[0] содержит код, равный числу символов в значении S, т.е. длина строки S всегда равна Ord(S[0]). Эту особенность надо помнить при заполнении длинных строк
- 151 -
| VAR
| > ch : Char;
| > st : String;
| BEGIN
| > st := 'Hello';
| > ch := st[1]; { ch = H }
| > st[2] := 'E'; { st = 'HEllo' }
| > ch := 'x';
| > st := ch; { st = 'x' }
| END.
Рис. 8.2
одинаковым символом. В самом деле, не писать же в программе S := '... и далее, например, 80 пробелов в кавычках! Проблему заполнения решает встроенная процедура FillChar:
VAR St : String;
...
FillChar( St[1], 80, ' ' );
St[0] := Chr(80); {!!!}
Здесь St[1] указывает, что надо заполнять строку с первого элемента. Можно начать заполнение и с любого другого элемента. В данном случае строка заполняется с начала 80 пробелами (' ' или #32). Очень важен последующий оператор: так как строка «закрашивается» принудительно, ей надо сообщить, сколько символов в ней стало, т.е. записать в St[0] символ с кодом, равным ее новой длине.
Первоначально строка содержит «мусор», и всегда рекомендуется перед использованием инициализировать строки пустыми значениями или чем-либо еще.
При использовании процедуры FillChar всегда есть риск «выскочить» за пределы, отводимые данной строке, и заполнять символом рабочую память данных. Компилятор таких ошибок не замечает, и вся ответственность ложится на программиста.
8.2. Операции над символами
Символы можно лишь присваивать и сравнивать друг с другом. При сравнении символов они считаются равными, если равны их ASCII-коды; и один символ больше другого, если имеет больший ASCII-код:
Символы можно лишь присваивать и сравнивать друг с другом. При сравнении символов они считаются равными, если равны их ASCII-коды; и один символ больше другого, если имеет больший ASCII-код: