Работа со строками
Структура строк
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.































