В Паскале определены два типа строк:
- Тип String
- тип PChar
Стандартная строка (string) в Паскале, представляет из себя массив, первый элемент которого содержит длину строки, а начиная со второго элемента начинается полезная информация. Поскольку нумерация начинается с 0, то первый элемент строки, содержащий длину строки, имеет индекс 0.
Если Вы попытаетесь осуществить следующее присвоение:
var
s:string;
I:byte;
begin
readln(s);
i:=s[0];
end.
то компилятор выдаст сообщение об ошибке (несовместимость типов), потому что
все элементы строки - символы (Char)
Для определения длины строки можно использовать или стандартную процедуру Length(stroka) или так:
var
dlinna_stroki:byte
s:string;
begin
readln(s); {вводим строку}
dlinna_stroki:=Ord(s[0]);
end.
Второй способ менее нагляден, но полезен если Вы забыли стандартные процедуры.
К каждому элементу строки можно обратиться, как к элементу массива. Длина строк ограниченна 255 символами. Поскольку первый элемент строки кодируется одним байтом, он может закодировать максимум 255 элементов.
II. PChar
Для обеспечения поддержки строк, длиннее 255 символов, в TP7 был введен новый тип - PChar. Он имеет следующую структуру:
Type
PChar = ^Char;
Т.е. представляет собой указатель, но в отличие от обычных указателей, он трактуется необычным образом: считается, что он указывает на цепочку символов, заканчивающуюся символом с кодом #0.
Тип PChar совместим с одномерным символьным массивом с нулевой левой границей (array[0..max]).
Переменные типа PChar индексируются, т.е. к элементам длинной строки можно обратиться по их индексу, как к элементам обычной строки.
СТРОКИ. ЧаВо.
- После посимвольного ввода строки, не получается вывести ее на экран. В чем дело?
При посимвольном вводе строки, Вы забыли указать длину получившейся строкиs[0]:=chr(dlinna)
Или иначе, при вводе:{...}
{ввод очередного символа}
{...}
Inc(S[0]); - Почему не получается индексировать длинную строку?
Включите расширенный синтаксис директивой {$X+} или в настройках компилятора - Есть какие-нибудь процедуры для работы с длинными строками?
Да, есть. В модуле strings - Как вывести длинную строку на экран?
Процедурой Writeln, при включенно расширенном синтаксисе. - Сколько занимает в памяти строка?
Для обычных строк, если не указана длина строки, то 256 байт.
Если, при описании переменной, указана длина строки явно (string[8]), то столько, сколько указано +1 байт на нулевой элемент (хранение длинны строки).
Для PChar размер в памяти равен количеству элементов до символа #0 +1 байт. - Как перевернуть строку?
(с использованием второй строки):var
s,f: string;
i,j: byte;
begin
readln(s); j:=1;
for i:=length(s) downto 1 do begin
f[j]:=s[i]; inc(j);
end;
f[0]:=chr(j);
writeln(f);
end.
(from APAL с использованием одной строки и одной переменной типа Char):var
s:string;
f:Char
i:byte;
begin
readln(s);
for i:=1 to Length(s) div 2 do begin
f:=s[i];
s[i]:=s[Length(s)-i+1];
s[Length(s)-i+1]:=f;
end;
writeln(s);
end.