Функции работы со строками

Символы и строки.

Символы

Символ – это один знак. Любой – буква, цифра, арифметический знак или пробел, знак препинания или подчеркивания... А также специальные символы – переход на новую строку, BackSpace, знак доллара или процент. Тип "символ" в Delphi обозначается Char:

var c : Char;begin c := 'В'; ShowMessage('Вы ввели ' + c); c := #13; ShowMessage('Переход на новую' + c + 'строку'); ...

Мы уже говорили, что символы берутся из таблицы символов ANSI или UNICODE. Большинство символов используются пользователями, некоторые символы являются служебными. Обратите внимание, что большая буква "А" и маленькая "а" - это разные символы! Также разными символами являются латинская "с" и русская "с", хотя они похожи, как две капли воды.

Нулевой символ не используется, он зарезервирован как полный нуль. Программисты нашли достойное применение этому символу, используя его в событиях ввода текста, когда требуется запретить пользователю ввод каких-либо символов. Служебные символы мы не можем увидеть в текстовом поле. Служебные символы, это <Esc>, <Enter>, <Tab> и другие. Каждый символ обрабатывается компьютером как число от 0 до 255, таким образом, слово "ПРИВЕТ" в памяти машины будет выглядеть как набор цифр: "207 208 200 194 197 210".

Функции работы с символами

В практике часто приходится обрабатывать отдельные символы. Переменным символьного типа Char можно присваивать значения таким образом:

var c,b : Char;begin c := 'a'; b := c;

Поскольку для компьютера символ – число, то символьные данные можно сравнивать между собой. При этом большим будет тот символ, число которого в таблице символов больше. Например, 'я' будет больше, чем 'а':

if b > c then ShowMessage('Истина!')else ShowMessage('Ложь!');

При работе с символьными переменными часто используют функции Chr() и Ord(). Функция Chr() принимает в качестве параметра число, и возвращает символ, который соответствует этому числу в таблице ANSI:

function Chr ( X: Byte ): Char;

Функция Ord() совершает прямо противоположное действие, она принимает в качестве параметра символ, и возвращает число, под которым этот символ хранится в таблице ANSI:

function Ord ( C: Char ): Byte;

Символьные переменные можно использовать с этими функциями:

a := Chr(200); i := Ord(a);i := Ord('f');

В первой строке в переменную a мы записали символ "И", которому в таблице символов соответствует номер 200. Во вторую, целую переменную, мы записали число 200, так как символ с этим номером был записан в переменную a, которую мы передали в качестве параметра. Наконец, в третьей строке мы в целую переменную записали число 102, этот номер соответствует символу "f".

Строка

Строка – это набор символов. Строку можно представить в виде статичного или динамичного массива символьных данных. Типы строк мы уже разбирали в 4 лекции: AnsiString – строка из ANSI – символов, и WideString – строка из UNICODE – символов.

Тип String не является отдельным типом, по умолчанию он равен AnsiString. Однако его можно перенастроить и на WideString, хотя в этом нет необходимости. Поэтому смело указывайте строковые переменные, как String:

var s : String;begin s := 'Это многострочная' + #13 + 'строка'; ShowMessage(s);

Как видно из примера, строку можно составлять из нескольких подстрок, и даже добавлять в нее отдельные символы. В примере мы добавили символ под номером 13, это символ перехода на новую строку. В результате выполнения этого кода процедура ShowMessage() выведет на экран сообщение, разбитое на две строки:

Это многострочнаястрока

ShortString – короткая строка из ANSI – символов. Может содержать от 0 до 255 символов. Используется нечасто. Собственно, вы можете объявить тип String с заранее указанным размером:

var s : String[100];

Как видите, строка объявляется с числовым индексом, почти как массив. Собственно, строка символов и есть массив символьных данных, и обращаться с ней можно также. Индексация символов в строке начинается с единицы, то есть, индексу 1 соответствует 1-й символ строки.

var stroka : String;begin stroka := 'Привет'; stroka[5] := 'а'; //изменили 5-й символ строки ShowMessage(stroka); //результат: строка "Приват"

PChar

Это тоже строка, и в будущем нам придется с ней сталкиваться. Эта строка работает совершенно иначе, чем String. Строка String представляет собой массив символов, в нулевом элементе которого содержится количество байт, отводимых под эту строку. А переменная типа PChar – это не сама строка, а указатель на начало строки, то есть переменная указывает на первый символ строки в памяти компьютера. А где же тогда PChar хранит количество байт в строке?! А нигде! Мы уже говорили о таблице символов ANSI, и выяснили, что нулевой символ – пустой. Вот последний символ PChar как раз и хранит этот символ, и компьютер, найдя его, считает, что строка окончена.

Со строками PChar работать очень неудобно, однако нам придется это делать, когда мы будем работать с функциями WinAPI напрямую. Функции WinAPI – это функции самой Windows, а не Delphi. Однако Delphi позволяет использовать их. Иногда это бывает необходимо, например, когда средств Delphi недостаточно для выполнения намеченной задачи. Использование таких функций не всегда удобно, однако они выполняются процессором намного быстрее, так как содержатся в самой операционной системе. Пример – функция MessageBox().

Вы уже привыкли выводить сообщения с помощью функции Delphi ShowMessage()? Привыкайте к новой функции!

Application.MessageBox('строка 1', 'строка 2',[ кнопки + тип_окна]);

Здесь:

· строка 1 - выводит текст внутри окна.

· строка 2 – текст в заголовке окна.

Если не указывать [кнопки + тип_окна] то выйдет простое окно с кнопкой ОК, как в функции ShowMessage().

Таблица 10.1. Типы кнопок
Кнопки Описание
MB_OK (ОК)
MB_OKCANCEL (ОК и Отмена)
MB_RETRYCANCEL (Повторить и Отмена)
MB_YESNO (Да и Нет)
MB_YESNOCANCEL (Да, Нет и Отмена)
MB_ABORTRETRYIGNORE (Прервать, Повтор и Пропустить)
Таблица 10.2. Типы окон
Тип окна Описание
MB_ICONWARNING (желтый треугольник с "!")
MB_ICONINFORMATION (белый шарик с "i")
MB_ICONQUESTION (белый шарик с "?")
MB_ICONERROR (красный круг с белым крестиком)
       

Эта функция, помимо вывода сообщения, также возвращает значение – идентификатор кнопки, которую нажал пользователь:

Таблица 10.3. Возвращаемое функцией значение
Значение Нажатая кнопка
IDOK ОК
IDCANCEL Отмена
IDABORT Прервать
IDRETRY Повтор
IDIGNORE Пропустить
IDYES Да
IDNO Нет

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

Application.MessageBox('Ошибка копирования файла!', 'Ошибка', MB_ABORTRETRYIGNORE+MB_ICONERROR)

В результате выполнения этой функции программа выведет окно:


Рис. 10.1. Окно функции MessageBox()

Давайте сразу попробуем эту функцию на примере. Создайте новое приложение. На форму установите компонент Label для вывода результата, и кнопку. В свойстве Caption компонента Label удалите весь текст. Создаем обработчик нажатия кнопки. Поскольку функция возвращает перечисляемое значение, мы можем использовать case. Пишем такой код:

case Application.MessageBox('Ошибка копирования файла!', 'Ошибка', MB_ABORTRETRYIGNORE+MB_ICONERROR) of IDABORT : Label1.Caption := 'Прервать'; IDRETRY : Label1.Caption := 'Повтор'; IDIGNORE: Label1.Caption := 'Пропустить'; end; //case

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

Сохраните пример, откомпилируйте и посмотрите, как он работает. Попробуйте изменить тип окна на другой, например на MB_ICONQUESTION.

Функции работы со строками

Используя операции сравнения =, <, >, <=, >= строки можно сравнивать между собой. При этом большей считается та строка, в одинаковой позиции которой находится символ с большим кодом. Если все символы одинаковы, строки считаются равными. Примеры:

Таблица 10.4. Примеры сравнения строк
Строка 1 Строка 2 Результат сравнения
Иванов Иванов Строки равны
васильев Васильев Строка 1 > Строки 2
Алексеев Петров Строка 1 < Строки 2
Иванова Иванов Строка 1 > Строки 2

Строки часто приходится обрабатывать: удалять или заменять часть строки, определять количество символов в строке, определять, находится ли в строке искомый текст, и так далее. Ниже приведены функции, которые позволят совершать со строкой все необходимые действия.

Length()

Очень полезная, и часто используемая функция. Она возвращает длину строки (количество символов). Примеры использования:

Var s : String; i : Integer;begin s := ‘Иванов’; i := Length(s); //результат – 6 i := Length(‘Иванова’); // результат - 7

Процедура Delete

Процедура принимает в качестве параметра строку и удаляет какую-то ее часть. Синтаксис процедуры такой:

Delete(Строка, p, n);

Где:

· Строка – переменная строкового типа.

· p – номер символа, с которого начинается удаление.

· n – количество удаляемых символов.

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

s := 'Город Санкт-Петербург';Delete(s, 7, 6);

В результате выполнения данного кода в строке s останется текст "Город Петербург".

Функция Pos()

Функция находит подстроку Substr в строке S и возвращает индекс первого символа найденной подстроки. Если S не содержит указанную подстроку, то функция возвращает 0:

Функция Pos ( Substr: string; S: string ): Integer;

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

var S: string; I: Integer;begin S:= 'В лесу родилась елочка'; I:= Pos( 'лес', S); // I = 3end;

Функция Copy()

Функция возвращает подстроку размером Count символов, начиная с символа Index. Параметр S – передаваемая в функцию строка; Index и Count – целые числа. Если Index больше длины строки, то функция возвращает пустую строку. Если значение параметра Count больше, чем может быть возвращено функцией, то возвращаются символы или элементы, начиная с Index и до конца S.

Функция Copy ( S, Index, Count ): string;

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

var S: string;begin S:= 'Победа'; S:= Copy( S, 3, 4); // S = 'беда'end;

На начальном этапе обучения этих функций вам будет вполне достаточно. С их помощью можно решить практически любую задачу по обработке символов и строк.