Робота з рядковими типами даних в Delphi, Різне, Програмування, статті

Строковий тип даних – один з найбільш часто використовуваних в програмах тип. Дійсно, без нього не обходиться практично жоден алгоритм. Навіть програми, які виконують виключно математичні операції, деколи, написані з використанням строкових типів даних.


Рядок – це послідовність символів. В Object Pascal існує кілька строкових типів. Ось основні з них:
























Тип даних

Максимальна довжина

Пам’ять, яка використовується

Використовується для …

ShortString

255 символів

від 2 до 256 байт

Мінімальна сумісність, зберігання невеликих рядків

AnsiString

близько 2 ^ 31 символів

від 4 байт до 2 Гб

8-бітові символи (ANSI), DBCS ANSI, MBCS ANSI і т.д.

WideString

близько 2 ^ 30 символів

від 4 байт до 2 Гб

Юнікод-символи – багатокористувацькі сервера, багатомовними програми

Для більшості цілей підходить тип AnsiString (Іноді називається Long String).


Стандартні функції обробки рядків:


1) Функція Length(Str: String) – Повертає довжину рядка (символів). Приклад:

var
   Str: String; L: Integer;
{ … }
Str:=”Hello!”;
L:=Length(Str);  { L = 6 }


2) Функція SetLength(Str: String; NewLength: Integer) дозволяє змінити довжину рядка. Якщо рядок містила більшу кількість символів, ніж задано в функції, то “зайві” символи обрізаються. Приклад:

var Str: String;
{ … }
Str:=”Hello, world!”;
SetLength(Str, 5); { Str = “Hello” }


3) Функція Pos(SubStr, Str: String) – Повертає позицію підрядка в рядку. Нумерація символів починається з одиниці (1). У разі відсутності підрядка в рядку повертається 0. Приклад:

var Str1, Str2: String; P: Integer;
{ … }
Str1:=”Hi! How do you do?”;
Str2:=”do”;
P:=Pos(Str2, Str1);  { P = 9 }


4) Функція Copy(Str: String; Start, Length: Integer) – Повертає частину рядка Str, починаючи з символу Start довжиною Length. Обмежень на Length немає – якщо воно перевищує кількість символів від Start до кінця рядка, то рядок буде скопійована до кінця. Приклад:

var Str1, Str2: String;
{ … }
Str1:=”This is a test for Copy() function.”;
Str2:=Copy(Str1, 11, 4); { Str2 = “test” }


5) Процедура Delete(Str: String; Start, Length: Integer) – Видаляє з рядка Str символи, починаючи з позиції Start довжиною Length. Приклад:

var Str1: String;
{ … }
Str1:=”Hello, world!”;
Delete(Str1, 6, 7); { Str1 = “Hello!” }


6) Функції UpperCase(Str: String) і LowerCase(Str: String) перетворять рядок відповідно у верхній і нижній регістри:

var Str1, Str2, Str3: String;
{ … }
Str1:=”hELLo”;
Str2:=UpperCase(Str1); { Str2 = “HELLO” }
Str3:=LowerCase(Str1); { Str3 = “hello” }


Рядки можна порівнювати один з одним стандартним способом:

var Str1, Str2, Str3: String; B1, B2: Boolean;
{ … }
Str1:=”123″;
Str2:=”456″;
Str3:=”123″;
B1:=(Str1 = Str2); { B1 = False }
B2:=(Str1 = Str3); { B2 = True }


Якщо рядки повністю ідентичні, логічне вираз стане рівним True.


Додаткові функції обробки рядків:


У модулі StrUtils.pas містяться корисні функції для обробки строкових змінних. Щоб підключити цей модуль до програми, потрібно додати його ім’я (StrUtils) В розділ Uses.


1) PosEx(SubStr, Str: String; Offset: Integer) – Функція аналогічна функції Pos(), Але дозволяє задати відступ від початку рядка для пошуку. Якщо значення Offset задано (воно не є обов’язковим), то пошук починається з символу Offset в рядку. Якщо Offset більше довжини рядка Str, то функція возрата 0. Також 0 повертається, якщо підрядок не знайдена в рядку. Приклад:

uses StrUtils;
{ … }
var Str1, Str2: String; P1, P2: Integer;
{ … }
Str1:=”Hello! How do you do?”;
Str2:=”do”;
P1:=PosEx(Str2, Str1, 1); { P1 = 12 }
P2:=PosEx(Str2, Str1, 15); { P2 = 19 }


2) Функція AnsiReplaceStr(Str, FromText, ToText: String) – Робить заміну вираження FromText на вираз ToText в рядку Str. Пошук здійснюється з урахуванням регістру символів. Слід враховувати, що функція НЕ змінює самої рядка Str, а тільки повертає рядок з виробленими замінами. Приклад:

uses StrUtils;
{ … }
var Str1, Str2, Str3, Str4: String;
{ … }
Str1:=”ABCabcAaBbCc”;
Str2:=”abc”;
Str3:=”123″;
Str4:=AnsiReplaceStr(Str1, Str2, Str3); { Str4 = “ABC123AaBbCc” }


3) Функція AnsiReplaceText(Str, FromText, ToText: String) – Виконує те ж саме діяння, що і AnsiReplaceStr (), але з одним винятком – заміна проводиться без урахування регістра. Приклад:

uses StrUtils;
{ … }
var Str1, Str2, Str3, Str4: String;
{ … }
Str1:=”ABCabcAaBbCc”;
Str2:=”abc”;
Str3:=”123″;
Str4:=AnsiReplaceText(Str1, Str2, Str3); { Str4 = “123123AaBbCc” }


4) Функція DupeString(Str: String; Count: Integer) – Повертає рядок, що утворилася з рядка Str її копіюванням Count раз. Приклад:

uses StrUtils;
{ … }
var Str1, Str2: String;
{ … }
Str1:=”123″;
Str2:=DupeString(Str1, 5); { Str2 = “123123123123123” }


5) Функції ReverseString(Str: String) і AnsiReverseString(Str: AnsiString) – Інвертують рядок, тобто розташовують її символи у зворотному порядку. Приклад:

uses StrUtils;
{ … }
var Str1: String;
{ … }
Str1:=”0123456789″;
Str1:=ReverseString(Str1); { Str1 = “9876543210” }


6) Функція IfThen(Value: Boolean; ATrue, AFalse: String) – Повертає рядок ATrue, якщо Value = True і рядок AFalse якщо Value = False. Параметр AFalse є необов’язковим – в разі його відсутності повертається порожній рядок.

uses StrUtils;
{ … }
var Str1, Str2: String;
{ … }
Str1:=IfThen(True, “Yes”); { Str1 = “Yes” }
Str2:=IfThen(False, “Yes”, “No”); { Str2 = “No” }


Ми розглянули функції, що дозволяють виконувати з рядками практично будь-які маніпуляції. Як правило, замість рядка з зазначеним типом даних, можна використовувати й інший тип – все сприймається однаково. Але іноді потрібні перетворення. Наприклад, багато методи компонент вимагають параметр типу PChar, Отримати який можна зі звичайного типу String функцією PChar(Str: String):

uses ShellAPI;
{ … }
var FileName: String;
{ … }
FileName:=”C:WINDOWS
otepad.exe”;
ShellExecute(0, “open”, PChar(FileName), “”, “”, SW_SHOWNORMAL);


Тип Char являє собою один-єдиний символ. Працювати з ним можна як і зі строковим типом. Для роботи з символами також існує кілька функцій:


Chr(Code: Byte) – Повертає символ з вказаним кодом (за стандартом ASCII):

var A: Char;
{ … }
A:=Chr(69); { A = “E” }


Ord(X: Ordinal) – Повертає код зазначеного символу, тобто виконує протилежну дію функції Chr():

var X: Integer;
{ … }
X:=Ord(“F”); { X = 70 }


З рядка можна отримати будь-який її символ – слід розглядати рядок як масив. Наприклад:

var Str, S: String; P: Char;
{ … }
Str:=”Hello!”;
S:=Str[2]; { S = “e” }
P:=Str[5]; { P = “o” }


У цій статті описані основні прийоми роботи з рядковими типами даних. Як правило, цих даних досить для написання будь-якого алгоритму.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*