Строки очень часто используются в программах - хотя бы для вывода различных сообщений пользователю, чтобы он не заблудился в интерфейсе. Ну, для таких простых случаев вполне достаточно тех сведений, которые вы получили на уроке, посвящённом строкам. Если же у вас более серьёзные намерения и вы хотите манипулировать строками по своему желанию (например, вы пишете какую-нибудь словесную игру вроде Балды или Логогрифов), то в Delphi найдётся всё нужное и для таких любителей словесности и жонглирования приставками и суффиксами.
Для определённости в примерах будем считать, что
s1= 'СМОРОДИНА', а s2='ПАРАШЮТ'.
Когда мы изучали простые операции со строками, то рассматривали конкатенацию строк с помощью оператора +. Но объединить две строки можно и функцией
function Concat(S1: string; S2: string): string;
которая возвращает «сумму» двух строк:
concat(s1,s2) ^ СМОРОДИНАПАРАШЮТ
Для сравнения строк вместо операторов отношения можно использовать следующие функции.
function CompareStr(const S1: string;
const S2: string): Integer;
function CompareText(const S1: string;
const S2: string): Integer;
Обе функции сравнивают строки s1 и s2. Первая - с учётом регистра букв (прописные/строчные), вторая - без учёта.
Эти функции возвращают значение
0, если строки равны;
< 0, если si < s2 > 0, если si > s2.
Их нельзя применять к русским словам, поэтому лучше пользоваться функциями:
function AnsiCompareStr(const S1: string; const S2: string): Integer;
function AnsiCompareText(const S1: string; const S2: string): In
teger;
которые одинаково хорошо работают и с латинскими, и с русскими буквами.
Теперь перейдём к процедурам и функциям, которые выполняют со словами более сложные действия.
Довольно часто нужно преобразовать все буквы слова либо к верхнему, либо к нижнему регистру. Если слова состоят только из латинских букв, то можно использовать функции:
function LowerCase(const S: string): string;
function Uppercase(const S: string): string;
Первая переводит слова в нижний регистр (строчные буквы), вторая - в верхний (прописные буквы). Для русских (и для латинских) букв годятся функции:
function AnsiLowerCase(const S: string): string;
function AnsiUpperCase(const S: string): string;
Например:
Функция AnsiLowerCase (S1) вернёт строку «смородина».
Функция AnsiUpperCase (’смородина’) вернёт строку «СМОРОДИНА».
Процедуры вывода сообщений на экран (обычно в метку или список) требуют в качестве параметра строку, а что делать, если нужно предъявить пользователю число? - Преобразовать число в строку! Это можно сделать и самостоятельно, но гораздо удобнее воспользоваться встроенными функциями Delphi.
Чаще других в программах применяют функции для преобразования целых чисел в строку:
function IntToStr(Value: Integer): string; function IntToStr(Value: Int64): string;
Например, IntToStr (1234) вернёт строку «1234».
Для действительных чисел тоже имеется подобная функция
Если вы хотите узнать, как десятичное число записывается в 16-ричной системе счисления, примените к нему функции:
function IntToHex(Value: Integer; Digits: Integer): string; function IntToHex(Value: Int64; Digits: Integer): string;
Например, IntToHex (12 34, 8) вернёт строку «000004D2», а IntToHex (2009, 4) - строку «07D9».
Второй параметр - Digits - задаёт число цифр в 16-ричном числе.
При вводе данных из файла или некоторых компонентов вместо числа мы получаем строку символов. И хотя она состоит из цифр, это не число. В этом случае поможет функция
function StrToInt(const S: string): Integer;
Причём строка S может содержать не только десятичное, но и 16-ричное число.
Например, функции StrToInt(’$07D9’) и StrToInt(’2009’) вернут одно и то же число 2009.
Однако эта функция «опасна»: если в строке обнаружится хотя бы один неверный символ, возникнет ошибка. Если у вас есть обоснованные сомнения в правильности строки, лучше обратиться к надёжной функции
function TryStrToInt(const S: string; out Value: Integer):Boolean;
var b: boolean; i: integer;
b:=TryStrToInt(’$07D9s’, i);
if b then lstProtokol.Items.Add (inttostr(i));
Она возвращает TRUE, если строка преобразована в число без ошибок, и FALSE, если с ошибками. Переменная Value (в нашем примере i) хранит число.
В примере строка '$07D9s' содержит неверный символ «s», поэтому функция вернёт FALSE и строку печатать не нужно (на самом деле значение переменной i будет равно 2009, так как функция успеет конвертировать первые символы строки - до первой «нецифры»).
Так же можно использовать и процедуру:
procedure Val(S: string; var V: Type; var Code: Integer);
S - это строка,
V - переменная целого или действительного типа.
Code - переменная целого типа, в которой возвращается номер ошибочного символа в строке. Если таких символов нет, то значение этой переменной будет равно нулю.
В результате выполнения этого примера будет напечатано число 2009.
Этот код также напечатает число 2009, но значение переменной i будет равно не нулю, как в первом случае, а 6, так как шестой символ строки не является 16-ричной цифрой.
Аналогичные функции для вещественных чисел:
function StrToFloat(const S: string): Extended;
function TryStrToFloat(const S: string; out Value: Extended):Boolean;
function TryStrToFloat(const S: string; out Value: Double): Boolean;
function TryStrToFloat(const S: string; out Value: Single):
Boolean;
В начале и/или конце строки могут присутствовать ненужные пробелы. От них легко избавиться, применив функции
function TrimLeft(const S: string): string;
function TrimRight(const S: string): string;
function Trim(const S: string): string;
Первая удаляет начальные пробелы, вторая - конечные, третья - и те, и другие. Эти функции возвращают новую строку - уже без пробелов.
Узнать длину строки (число символов в ней) можно с помощью функции
function Length(S: string): Integer;
Например, Length (S1) вернёт 9, а Length(S2) - 7.
Ну, а теперь - самые интересные процедуры и функции!
Удаляем часть строки S от символа номер Index:
procedure Delete(var S: string; Index: Integer; Count: Integer);
Здесь Count - число удаляемых символов.
Например, после выполнения процедуры:
delete(s1,1,3);
строка si будет иметь значение «РОДИНА».
А после процедуры delete(s2,5,3); строка s2 будет урезана до «ПАРА».
Если значение переменной Index меньше единицы или больше длины строки, то строка останется без изменений. Ничего не случится со строкой и если Count меньше единицы.
Если же Count больше, чем число символов в строке, начиная с Index, то будут удалены все символы до конца строки.
Процедура Insert действует противоположно - она вставляет подстроку Substr в строку Dest после символа номер Index:
procedure Insert(Substr: string; var Dest: string; Index: Integer);
Например, после выполнения процедуры insert (’З’, s1,6); строка s1 превратится в смешное слово «СМОРОЗДИНА».
А процедура insert (’КА’, s2,8); позволит нам насладиться неологизнеологизмом «ПАРАШЮТКА».
Если же мы не хотим портить исходную строку, как это делает процедура Delete, то можем создать новую строку, вырезав из любой строки нужный нам кусок:
function Copy(S: string; Index: Integer; Count: Integer): string;
Например, строка s примет значение «ПАРА» после выполнения функции s:=copy(s2,1,4);
Обратите внимание: чтобы получить то же самое слово, что и в примере с delete(s2,5,3);, мы указали другие значение параметров в вызове функции!
Функция copy (s1,4,9) вернёт в переменную s слово «РОДИНА».
И последняя функция находит позицию подстроки substr в строке str. function Pos(const substr: string; const str: string): Integer;
Если в строке искомая подстрока встречается несколько раз, то первый вызов функции Pos вернёт позицию первого вхождения, после чего поиск нужно продолжить со следующей позиции. Например, в слове ФЕЛЬДФЕБЕЛЬ так можно найти обе «ели».
Для наших слов:
i := pos ('МОР', s1); вернёт 2, а
i:= pos ('АШ', s2); - 4.
Если же подстроки в строке нет, то вернётся безнадёжный ноль!