Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

3.3Обработка символьной информации в Паскале

____________________________________________________________________

{$IFDEF WINDOWS}

answ:= CP866ToUTF8(answ);

{$ENDIF}

Директива {$IFDEF <условие>} предписывает компилятору компили-

ровать операторы, находящиеся после нее и до {$ENDIF} если <условие>

выполняется. В противном случае эти операторы пропускаются. В данном слу-

чае оператор

answ:= CP866ToUTF8(answ);

будет включен в компиляцию в операционной системе Windows и будет про-

пущен в Linux. Полная форма этой директивы:

{$IFDEF <условие>}

<операторы> // компилируются, если <условие> выполнено

{$ELSE}

<операторы> // компилируются, если <условие> не выполнено

{$ENDIF}

3.3.1.4. Строковые процедуры и функции

Функция Concat- выполняет конкатенацию последовательности строк,

т. е. объединение нескольких строк.

Описание: Concat(S1[,S2,…,Sn]: string): string;

S1,S2,…,Sn – формальные параметры, имеют тип string. Квадратные скобки указывают, что параметры S2,…,Sn могут отсутствовать. Результат функции строка символов, т.е. имеет тип также string.

Пример:

176

Глава 3 Более сложные элементы языка

____________________________________________________________________

program function_concat; {$mode objfpc}{$H+} uses

Crt, FileUtil; var

a, c: string; begin

a:= 'Коля + Оля'; writeln(UTF8ToConsole('Первая строка: '),

UTF8ToConsole(a));

c:= ' = любовь';

writeln(UTF8ToConsole('Вторая строка: '),

UTF8ToConsole(c));

c:= Concat(a, c);

writeln(UTF8ToConsole('Результирующая строка: '),

UTF8ToConsole(c));

writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

Функция Length - возвращает динамическую длину строки.

Описание: Length(S: string): integer;

Пример:

program function_length; {$mode objfpc}{$H+} uses

CRT, FileUtil, SysUtils; var

S: string;

177

3.3Обработка символьной информации в Паскале

____________________________________________________________________

i: integer;

begin

S:= 'Ivanov';

i:= Length(S);

writeln(UTF8ToConsole('Строка S: '), UTF8ToConsole(S)); writeln(UTF8ToConsole('Длина этой строки = '), i);

S:= '';

i:= Length(S);

writeln(UTF8ToConsole('Строка S: '), UTF8ToConsole(S)); writeln(UTF8ToConsole('Теперь длина строки стала = '), i); writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

Следует помнить, что функция Length()возвращает количество байтов,

занимаемой строкой! В этом легко убедиться, немного видоизменив предыду-

щую программу.

program function_length; {$mode objfpc}{$H+} uses

CRT, FileUtil, SysUtils; var

S, S1: string; i: integer;

begin

S:= 'Ivanov'; i:= Length(S);

writeln(UTF8ToConsole('Строка S: '), UTF8ToConsole(S)); writeln(UTF8ToConsole('Длина этой строки = '), i);

178

Глава 3 Более сложные элементы языка

____________________________________________________________________

S1:= 'Иванов';

i:= Length(S1);

writeln(UTF8ToConsole('Строка S1: '), UTF8ToConsole(S1)); writeln(UTF8ToConsole('Длина этой строки = '), i); writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

end.

Длина строки S равна 6, длина строки S1 равна 12! Это не ошибка, про-

сто функция Length()возвращает не количество символов в строке, а количе-

ство байтов, которую занимает строка в памяти. Для латиницы это получается одно и то же, поскольку в UTF-8 символы латиницы кодируются одним байтом,

а для кириллицы в два раза больше, так как русские буквы кодируются двумя байтами. Если вы хотите получить количество символов в строке с кириллицей,

можно воспользоваться функцией UTF8Length(). Эта функция объявлена в модуле LCLProc.

Замените в предыдущем примере оператор

i:= Length(S1);

на оператор

i:= UTF8Length(S1);

и добавьте модуль LCLProc в объявление uses и запустите заново про-

грамму. Теперь длина строки S1 также стала равна 6.

Попробуйте заменить оператор

i:= Length(S);

на оператор

i:= UTF8Length(S);

Вы увидите, что длина строки S по-прежнему равна 6. Т.е. функция

UTF8Length() для строк с латиницей работает идентично функции

Length(). Отсюда можно сделать вывод, что удобнее применять функцию

179

3.3Обработка символьной информации в Паскале

____________________________________________________________________

UTF8Length(), особенно, если вам заранее неизвестно содержимое строки.

Процедура SetLength - устанавливает длину строки.

Описание:

SetLength(S: string, n: integer);

S – строка, n – новая длина строки. Если строка состоит из кирилли-

цы, то необходимо n умножать на 2. А если строка содержит символы и кирил-

лицы и латиницы, то придется высчитывать, сколько символов кириллицы со-

держится в строке. Так что, без особой необходимости применять эту функцию не стоит.

Функция Copy – возвращает подстроку строки.

Описание:

Copy(S: string, index, count: integer): string;

S- исходная строка,

index - номер символа, начиная с которого выделяется подстрока из S, count - количество символов в подстроке.

В модуле LCLProc имеется аналог этой функции UTF8Copy().

Пример:

program function_copy; {$mode objfpc}{$H+} uses

CRT, FileUtil, LCLProc; var

a, c: string; begin

180

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773