Работа со строками

Структура строк

L – длина строки. В структурах строк верхняя строка – байты строки, нижняя – номера байтов.

Строка ShortString

Используется кодировка ANSI. Строка размещается компилятором в статической памяти. Для одного символа отводится 1 байт. Под строку ShortString выделяется память размером L+1 байт.

L C C C C C C C C C C C
0 1 2 3 . . L

L <=255

Строка AnsiString = LongString

Используется кодировка ANSI. Строка размещается в динамической памяти. Для одного символа отводится 1 байт. В статической памяти компилятор создает указатель размером в 4 байта, в который при создании строки заносится адрес ее начала. Указатель до создания строки и после ее удаления содеожит nil – признак отсутствия данных. Под строку AnsiString всего выделяется память размером L+4 байт.

L L L L C C C C C C C C
0 1 2 3 . . . . . . . L+3

L <=231

Строка WideString

Используется кодировка Unicod. Строка размещается в динамической памяти. Для одного символа отводится 2 байта. В статической памяти компилятор создает указатель размером в 4 байта, в который при создании строки заносится адрес ее начала. Указатель до создания строки и после ее удаления содержит nil – признак отсутствия данных. Под строку WideString всего выделяется память размером L*2+4 байт.

L L L L C C C C
0 1 2 3 . . . . . . L/2+3

L <=230 . В два раза меньше, чем у AnsiString

Строка PChar

Используется кодировка ANSI. Это нуль-терминальная строка. Признаком ее конца является код #0. Строка размещается в динамической памяти. Для одного символа отводится 1 байт. В статической памяти компилятор создает указатель размером в 4 байта, в который при создании строки заносится адрес ее начала. Указатель до создания строки и после ее удаления содержит nil – признак отсутствия данных. Под строку PCar  всего выделяется память размером L+1 байт.

L L L L C C C C C C C #0
0 1 2 3 . L L+1

L не ограничена

Строка PWideChar

Используется кодировка Unicod. Это нуль-терминальная строка. Признаком ее конца является код #0. Строка размещается в динамической памяти. Для одного символа отводится 2 байта. В статической памяти компилятор создает указатель размером в 4 байта, в который при создании строки заносится адрес ее начала. Указатель до создания строки и после ее удаления содеожит nil – признак отсутствия данных. Под строку PWideCar  всего выделяется память размером L*2+1 байт.

С С С С С #0
0 1 2 3 L*2. L*2+1

Методы обработки строк

В модулях System, SysUtils, Strings определены методы для обработки строк. Функциональное назначение методов:

  • Создание и удаление строк.
  • Копирование и объединение.
  • Длина и позиционирование.
  • Представление строки.
  • Преобразования  строки в иной тип.
  • Преобразования  иного типа в строку.
  • Сравнение строк.

Ниже рассмотрены наиболее часто используемые методы.

Строки String

Средства модуля System

Вызов Описание
Chr(N) Символ ASCII c номером N.
Concat(S1,S2,SN) Конкатенация строк S1, S2 …SN.
Copy(S, I, Count) Копирует Count символов  строки S с номера I.
Delete(S, I,C) Удаляет С символов  строки S с номера I.
Insert(S1,S2, I) Ввести подстроку S2 в строку S1, начиная с позиции I.
Length(S) Длина строки S.
LowerCase(S) Строка S в нижнем регистре.
Pos(S1,S2) Позиция подстроки S1 в строке S2
Str(X; S) Преобразовать число X в строку S.
StringOfChar(C, Count) Строка из Count символов C.
UpCase(S) Cтрока S в верхнем регистре.
Val(S,V, C) Преобразует строку S в число V. При ошибке  в C заносится номер ошибочного символа строки S.

Средства модуля SysUtils

Вызов Действие
IntToStr(V) Превращает целое число V в строку.
StrToInt(S) Превращает строку S в целое число.
StrToFloat(S) Превращает строку S в число.
FloatToStr(V) Превращают число V в строку.
FloatToStrF(V,Format) Превращают число V в строку, используя формат вывода Format.

В функции FloatToStrF Format может принимать значения:

  • ffcurrency – денежный,
  • ffExponent – научный,
  • ffFixed – фиксированный,
  • ffGeneral – обобщенный, с самым коротким результатом,
  • ffNumber – фиксированный с разделителями тысяч.

Примеры

Пример 1. Создание строк.

program Str_Create_Del;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

Str,Substr:string;

Index,Count:Integer;

begin

Str:=’123456789’;                                    // Cтрока Str

writeln(Str);                                            // 123456789

Index:=5;                                                // Начальная позиция (счет с 1)

Count:=3;                                         // Сколько символов

Delete(Str,Index,Count);                         // Удаление 3-х символов

writeln(Str);                                            // 123489

Substr:=StringOfChar(‘A’,4);                     // Подстрока Substr = ‘AAAA’

Insert(Substr,Str,Index);                          // Ввод Substr в Str с позиции 5

writeln(Str);                                            // 1234AAAA89

readln;                                              // Пауза, смотрю результат

end.

Пример 2. Копирование и объединение строк.

program Str_Copy_Concat;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

S1,S2,Source: string;

Index,Count: integer;

begin

S1:=’12345’;

Source:=’ABCD’;                                     // Строка источник

Index:=5;                                                // Начальная позиция (счет с 1)

Count:=3;                                         // Сколько символов

writeln(S1);                                             // Ответ 12345

writeln(Source);                                      // Ответ ABCD

S1:=Concat(S1,Source);                         // Вызов функции конкатенации

writeln(S1);                                             // Ответ 12345ABCD

S1:=S1+Source;                                     // Операция конкатенации

writeln(S1);                                             // Ответ 12345ABCDABCD

S2:=Copy(S1,Index,Count);                      // Копирование подстроки

writeln(S2);                                             // Ответ 5AB

readln;                                              // Пауза, смотрю результат

end.

Пример 3. Длина и позиционирование.

program Str_Len_Pos;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

S,SubStr:string;

p:byte;

L:integer;

begin

S:=’123456789’;                                    // Строка

SubStr:=’5678’;                                     // Подстрока

L:=Length(S);                                         // Определение длины строки

writeln(L);                                         // Ответ 9.

P:=Pos(SubStr,S);                                     // Определение позиции подстроки.

writeln(P);                                         // Ответ 5.

readln;                                              // Пауза, смотрю результат

end.

Пример 4. Преобразования String в иной тип

program Str_To;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

Str: string;

x,Val: real;

Code:integer;

begin

x:=123.45;

Str(x:7:3,Str);                                          // Число => строка

writeln(Str);                                            // Ответ 123.450 (3 дробных позиции)

Str(x,Str);                                         // Число => строка

writeln(S);                                         // Ответ 1.2345000000E+02

Val(Str,Val,Code);                                    // Строка => число

writeln(Val);                                            // Ответ 1.2345000000E+02

Val(’123Z’,Val,Code);                              // Строка => число с ошибкой

writeln(Val,Code);                                     // Ответ 4 – номер позиции с ошибкой

readln;                                              // Пауза, смотрю результат

end.

Пример 5. Преобразования  иного типа в String

program To_Str;

{APPTYPE CONSOLE}                              // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

S:string;

X,V:real;

Code:integer;

begin

X:=123.45;

Str(X:7:3,S);                                           // Число => строка

writeln(S);                                         // Ответ 123.450 (3 дробных позиции)

Str(X,S);                                                // Число => строка

writeln(S);                                         // Ответ 1.2345000000E+02

Val(S,V,Code);                                      // Строка => число

writeln(V);                                        // Ответ 1.2345000000E+02

S:=FloatToStr(V,ffFixed,6,3);                   // Число => строка с форматом

writeln(S);                                         // Ответ 123.450

readln;                                              // Пауза, смотрю результат

end.

Строки PChar

Средства обработки определены в модуле String. Строки PChar создаются в динамической памяти.

Вызов Действие
StrNew(S) Создать строку S.
StrDispose(S); Удалить строку S.
StrCopy(Dest, Source) Копирует в строку Dest строку Source.
StrECopy(Dest, Source) Копирует в строку Dest строку Source.
StrLCopy(Dest, Source, MaxLen) Копирует в строку Dest строку Source с ограничением в MaxLen числа символов в Dest.
StrMove(Dest, Source, Count) Копирует в строку Dest из строки Source Count символов с заменой.
StrCat(Dest, Sourcе) Присоединяет к строке Dest копию строки Source.
StrLCat(Dest, Source, MaxLen) Присоединяет к строке Dest копию строки Source. Число символов в результирующей строке не больше MaxLen.
StrCopy(Dest, Source) Копирует в строку Dest строку Source.
StrECopy(Dest, Source) Копирует в строку Dest строку Source.
StrLCopy(Dest, Source, MaxLen) Копирует в строку Dest строку Source с ограничением в MaxLen числа символов в Dest.
StrMove(Dest, Source, Count) Копирует в строку Dest из строки Source Count символов с заменой.
StrCat(Dest, Sourcе) Присоединяет к строке Dest копию строки Source.
StrLCat(Dest, Source, MaxLen) Присоединяет к строке Dest копию строки Source. Число символов в результирующей строке не больше MaxLen.
StrLen(Str:pChar) Возвращает длину строки без учета символа с кодом #0.
StrEnd(Str:pChar) Возвращает указатель на конец строки.
StrPos(Str1, Str2) Возвращает указатель на начало первого появления строки Str2 в Str1
StrScan(Str, Chr) Возвращает указатель на первое появление символа Chr в строке Str.
StrRScan(Str, Chr) Возвращает указатель на последнее появление символа Chr в строке Str.
StrLower(Str) Перевод строчных букв в прописные (только латинские).
StrUpper(Str) Перевод прописных букв в строчные (только латинские).
StrPas(Str) pChar -> string.
StrPCopy(Dest, Source) string -> pChar.
StrComp(Str1, Str2) Сравнивает строки. Возвращается: число < 0, если Str1<Str2, 0, если Str1=Str2, число > 0,  если Str1>Str2.
StrIComp(Str1, Str2) То же, но игнорируется разница в высоте латинских букв.
StrLComp(Str1, Str2, MaxLen) Подобна StrComp, но сравниваются первые MaxLen символов.
StrLIComp(Str1, Str2,MaxLen) Подобна StrIComp, но сравниваются первые MaxLen символов

Пример 1. Создание и удаление строк

program StrPChar_Create_Del;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

p:pChar;

begin

p:=StrNew(’1234′);                                   // Создать строку (аргумент не пустой)

{————};

StrDispose(p);                                        // Удалить строку

end.

Пример 2. Копирование и объединение

program StrPChar_Copy_Concat;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          //Ссылка на модули

var

s1,s2:string;                                             // Переменные типа string

p1,p2,p3:pChar;                                     // Переменные типа pChar

MaxLen:word;

begin

p1:=StrNew(‘AAAAAAAAAAAAAAAA’);                    // Создать в ДП переменную p1

p2:=StrNew(’123456′);                             // Создать в ДП переменную p2

p3:=StrNew(‘abcdef’);                               // Создать в ДП переменную p3

StrCopy(p1,p2);                                     // Копировать p2 в p1

s1:=StrPas(p1);                                      // Преобразовать p1 в s1 для вывода

writeln(s1);                                             // s1 = 123456

StrLCopy(p1,p2,4);                                // Копировать p2 в p1 с ограничением длины

writeln(StrPas(p1));                                // p1^=1234

p1:=StrMove(p1,p3,2);                             // Копирование из p3 2 элементов в p1 с заменой

writeln(StrPas(p1));                                // p1^=ab34

p1:=StrLCat(p1,p2,8);                              // Дописать p3 в p1 с ограничением длины

writeln(StrPas(p1));                                // p1^=ab34abcd

readln;                                              // Пауза, смотрю результат

end.

Пример 3. Длина и позиционирование

program StrPChar_Len_Pos;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

s1,s2:string;                                             // Переменные типа string

p0,p1,p2:pChar;                                     // Переменные типа pChar

L:word;                                                  // Длина строки

begin

p1:=StrNew(’12345678′);                         // Создать в ДП переменную p1

p2:=StrNew(’12345′);                               // Создать в ДП переменную p2

L:=StrLen(p1);                                       // Длина строки p1

writeln(L);                                         // L = 8

{————-}

p0:=p2;                                                  // Запомнить переменную p2 в p0

L:=0;                                                // Обнулить L

while p2<>StrEnd(p2) do                          // Повторять в цикле до конца строки

begin

P2^:=‘!’;                                     // Заполнить p2 знаками ”!”

Inc(p2);                                       // Увеличить указатель

Inc(L);                                   // Увеличить L на 1

end;

p2:=p0;                                                  // Восстановить p2 (на начало)

s2:=StrPas(p2);                                      // Преобразовать p2 в s2

writeln(s2);                                             // s2 = !!!!!

writeln(L);                                         // L = 5

readln;                                              // Пауза, смотрю результат

end.

Пример 4. Преобразования pChar <==> String

program StrPChar_Transform;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

s1,s2,s3:string;                                        // Переменные типа String

p1,p2,p3:pChar;                                     // Переменные типа pChar

begin

s1:=’AaBbDdЖж’;                                    // Переменная s1

p1:=StrNew(’12345678′);                         // Создать в ДП переменную p1

p2:=StrNew(’12345678′);                         // Создать в ДП переменную p2

p3:=StrNew(’12345678′);                         // Создать в ДП переменную p3

p1:=StrPCopy(p1,s1);                               // Копировать s1 в p1

StrCopy(p2,p1)                                      // Копировать p1 в p2

StrCopy(p3,p1);                                     // Копировать p1 в p3

p2:=StrLower(p1);                                    // Получить в p2 строчные буквы

p3:=StrUpper(p1);                                    // Получить в p3 прописные буквы

s2:=StrPas(p2);                                      // Преобразовать p2 в s2

s3:=StrPas(p3);                                      // Преобразовать p3 в s3

writeln(s1);                                             // s1 = AaBbDdЖж

writeln(s2);                                             // s2 = aabbccЖж

writeln(s3);                                             // s3 = AABBDDЖж

readln;                                                    // Пауза, смотрю результат

end.

Пример 5. Сравнение строк

program StrPChar_Comp;

{APPTYPE CONSOLE}                               // Консольное приложение

uses SysUtils;                                          // Ссылка на модули

var

p1,p2,p3,p4,p5,p6:pChar;                         // Переменные типа pChar

x:integer;                                                 // Для результата сравнения

begin

p1:=StrNew(‘ABC123′);                           // Создать в ДП переменную p1

p2:=StrNew(‘abc123’);                             // Создать в ДП переменную p2

p3:=StrNew(‘ABC123′);                           // Создать в ДП переменную p3

p4:=StrNew(’ABC456’);                          // Создать в ДП переменную p4

p5:=StrNew(‘ФЫВ123′);                          // Создать в ДП переменную p5

p6:=StrNew(’фыв456’);                        // Создать в ДП переменную p6

x:=StrComp(p1,p3);                               // Сравнить p1 и p3

writeln(x);                                         // x = 0

x:=StrComp(p1,p2);                               // Сравнить p1 и p2

writeln(x);                                         // x = -32

x:=StrComp(p4,p1);                               // Сравнить p4 и p1

writeln(x);                                         // x = 3

x:=StrComp(p5,p6);                               // Сравнить p5 и p6

writeln(x);                                         // x = -32

x:=StrIComp(p2,p3);                              // Сравнить p2 и p3

writeln(x);                                         // x = 0

x:=StrIComp(p5,p6);                              // Сравнить p5 и p6

writeln(x);                                         // x = – 32

x:=StrLComp(p1,p4,3);                            // Сравнить p1 и p4

writeln(x);                                         // x = 0

x:=StrLComp(p1,p3,4);                            // Сравнить p1 и p3

writeln(x);                                         // x = 0

x:=StrLIComp(p1,p4,4);                         // Сравнить p1 и p4

writeln(x);                                         // x = -3

readln;                                              // Пауза, смотрю результат

end.

Twitter SEO Community Ваау! News2.ru Chipp Korica SMI2 Google Bookmarks Digg I.ua Закладки Yandex Linkstore Myscoop Communizm Ru-marks Webmarks Ruspace Linkomatic Kli.kz Web-zakladka Zakladok.net Reddit delicious Ma.gnolia Technorati Slashdot Yahoo My Web БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong

Copyright © 2009-2010 Программирование на паскале.