Длинные строки
Среда Турбо Паскаль 7.0 обладает весьма интересным новшеством: в ней введена поддержка длинных строк, т.е. строк, длина которых может превышать 255 байт. Как известно, тип String в Турбо Паскале имеет максимальную длину 255 байт. Это связано с тем, что истинная длина строки в этом типе указывается первым байтом, мощность которого не позволяет определять строки большей длины. В то же время в языке С используется другой подход к заданию текстовых строк: первый байт строки является ее первым символом, второй байт – вторым символом и т.д. пока не встретится байт с символом #0.
Таким образом, длина строки не указывается явно, как в типе String, а определяется по замыкающему символу #0. Ясно, что такие строки могут иметь произвольную длину, ограничиваемую лишь объемом оперативной памяти или принятой схемой ее адресации: в MS-DOS такой границей является длина сегмента, поэтому максимально возможная длина С-строки для ПК составляет 65535 символов. Такие строки в дальнейшем будем называть ASCIIZ-строками.
Для реализации операций над ASCIIZ-строками в язык введен новый тип PChar, определяемый как указатель на символ:
type PChar =Char;
Однако такой обычный для Паскаля тип-указатель в рамках Турбо Паскаля 7.0 трактуется необычным способом: считается, что он указывает на цепочку символов, заканчивающуюся терминальным нулем, т.е. на ASCIIZ-строку. Более того, с этим типом совместим любой одномерный символьный массив с нулевой левой границей, а переменные типа PChar можно индексировать, как если бы они были массивами символов. Следующая программа напечатает все заглавные буквы английского алфавита:
{$Х+} {Включаем расширенный синтаксис} var Chars: array [0..26] of Char; {Массив символов} PChars: PChar; {Указатель на символ} k: Integer; begin for k: = 0 to 25 do Chars[k]: = Chr(k+ord('A'); {Наполняем массив} PChars: = Chars; {Указателю присваиваем массив!} PChars[26]: = #0; {Индексируем указатель!} WriteLn(PChars) {Печатаем указатель!} end.
Три последние оператора программы недопустимы в стандартном Паскале и в ранних версиях Турбо Паскаля, но возможны в версии 7.0, если включен расширенный синтаксис (директивой {$Х+} или опцией Options/Compiler/Extended syntax). Обратите внимание: процедура WriteLn этой версии умеет работать с ASCIIZ-строками.
Для поддержки ASCIIZ-строк разработан модуль Strings, в котором реализованы необходимы процедуры и функции.
Функция StrCat
Объединяет строки. Заголовок:
Function StrCat(Dest, Source: PChar): PChar;
Копирует строку Source в конец строки Dest и возвращает указатель на начало Dest.
Функция StrComp
Сравнивает строки. Заголовок:
Function StrComp(Strl, Str2: PChar): Integer;
Побайтно сравнивает строку Strl со строкой Strl и возвращает следующий результат:
=0 Strl=Str2; >0 Strl>Str2; <0 Strl<Str2.