Тип pchar

В язык программирования Pascal введен тип pchar, который описывает так называемые длинные (или ASCIIZ) строки. В переменных типа string длина строки записывается в нулевом байте, а т.к. в 1 байт нельзя записать значение, превосходящее 255, то и длина переменной типа string не может превосходить 255 символов. Переменная типа pchar – это строка, которая может иметь длину до 65534 символов. Длина таких строк не указывается явно: строка начинается с первого символа и замыкается символом #0. Поскольку тип pchar определяется как указатель на символ, ASCIIZ-строки создаются в динамической памяти. С типом pchar совместим любой символьный массив, левая граница которого равна нулю. ASCIIZ-строки индексируются с отсчетом значений индекса от 0. Строковые константы также могут быть записаны в переменные типа pchar. Для вывода ASCIIZ-строк применимы операторы write и writeln.

Пример использования ASCIIZ-строк:

const
    ch_arr: array[0..20] of char = 'Hello World!';
var
    p_str: pchar;
begin
    p_str := ch_arr;
    writeln(p_str);
    p_str[4] := #0;
    writeln(ch_arr);
readln
end.

В программе символьный массив объявлен в виде типизированной константы. Поскольку под него отведены 21 байт, его содержимое нужно было бы задавать строкой из 21 символа; однако в языке программирования Паскаль строковая константа, длина которой меньше количества элементов символьного массива, также записывается в символьный массив с автоматическим заполнением конца массива символом #0. В приведенной программе осуществляется коррекция переменной p_str, что меняет содержимое массива ch_arr, т.к. переменная p_str после присваивания p_str := ch_arr просто ссылается на этот массив и оперирует областью памяти, которую он занимает. Поэтому выражение p_str[4] := #0 изменяет длину строки ch_arr до четырех символов.

ASCIIZ-строка может быть объявлена типизированной константой, но ее длина в этом случае не может превосходить 255 символов. Например:

const
	pch: pchar = 'My name is ';

К данным типа pchar с помощью операции сложения можно добавлять целые значения, что соответствует смещению начала ASCIIZ-строки на указанное число позиций. Аналогично выполняется операция вычитания. Введена также операция вычитания между двумя ASCIIZ-строками, результатом которой является целочисленное значение, соответствующее смещению в памяти начала одной ASCIIZ-строки по отношению к началу другой.

const
    pch1: pchar = 'hello world';
    pch2: pchar = 'привет мир';
var
    p_str: pchar;
    n: longint;
begin
    p_str := pch1 + 6;
    writeln(p_str); // world
    writeln(pch2 + 7); // мир
 
    p_str := 'This is world';
    writeln(p_str);
 
    n := pch2 - pch1;
    writeln(n);
readln
end.

Значение n показывает взаимное смещение в памяти двух ASCIIZ-строк.
Основные средства по работе с ASCIIZ-строками сосредоточены в модуле Strings.

Комментарии

help me

Можно ли к символьному типу как-то дописывать?
Например, у меня переменная b='при', переменная с= 'вет'. Могу ли я их склеить в переменной допустим b и получить b='привет'?

ты можешь скрепить строки

ты можешь скрепить строки так

program s3;
var  d,s,sd : string;
begin
s:= 'При';
d:= 'вет';
sd:= insert(s,d,4);
writeln (sd);
end. 

Но эта программа только для слова "привет"!!!
Можно так

program s3;
var  a,b,sd : string;       
begin
write ('Введите первую часть слова - ');
readln (a);
write ('Ведите вторую часть слова - ');
readln (b);
sd:= concat(a,b);
writeln (sd);
end. 

В паскале abs не получается.

В паскале abs не получается. Пишет "Ошибка: преобразования типов"

Ошибка

writeln(p_str); // world
writeln(pch2 + 7); // мир

мир и world как я понял это комментарии? Так как Паскаль, при компиляции указал мне на error in statement с указанием курсора на /. Удалил символы // и слова мир и world заключил в {}. Ошибка исчезла и всё заработало. Либо умышленно это сделано, дабы дать нам хоть чуток подумать, либо всё таки маленькая путаница в языках.

Комментарии

В Паскале комментарии бывают только:
(* *), {}.

во FreePascal в том числе и

во FreePascal в том числе и //

Re: Ошибка

Просто данный пример приведен, как я понял, на делфи, а синтаксис объектного паскаля, в его основе, подразумевает, что вся правая часть строки после пары символов "//" является комментарием. Насчет классического паскаля не помню (очень давно это было), но возможно там отсутствовал такой синтаксис написания комментария, а был только "{}", либо была другая комбинация символов, для подобного выделения комментария в конце строки кода.