В C++ Builder AnsiString является типом строк, но в то же время реализован как класс, и объявлен в файле vcl/dstring.h. AnsiString аналогичен типу длинных строк в Delphi. Класс AnsiString имеет нулевой символ в конце строки. Объявленные переменные типа AnsiString инициализируются, как пустые строки.
AnsiString и операции отношения
==, !=, >, <, >=, <=
Все операции сравнения выполняются с учётом регистра. Сравнение кода символов начинается с первого символа, и в случае последующего символа он будет неодинаковым, то строка, которая содержит символ с наименьшим кодом, будет считаться меньше. Если же все символы совпали, но одна из строк окажется длиннее с большим количеством символов, то такая строка будет считаться больше, чем короткая.
AnsiString и операции присваивания и склеивания строк (конкатенации)
=, +=
+
Помимо операций присваивания и конкатенации в AnsiString определена операция индексации []. Стоит отметить, что индексы в ней начинаются с 1, а не с 0.
Пример индексации AnsiString
AnsiString str = "cubook.pro";
Label1->Caption = str[6];
// => k
Тип AnsiString применяется для множества свойств компонентов среды разработки C++ Builder. Например, свойство Caption текстовых меток, свойство Text окон редактирования и многих других. AnsiString так же применяется для отображения каких-либо отдельных строк в списках типа TStrings. Разрабатывая приложения, каждый будет сталкиваться с этими свойствами, что неминуемо приведёт к использованию AnsiString.
Пример конкатенации (склеивание) двух строк
Label2->Caption = Edit1->Text + ' ' + Edit2->Text;
Компоненту Label2 в свойство Caption передаётся значение для отображения текста, введённый пользователем в двух окнах редактирования Edit1 и Edit2, которые разделяются пробелом. Этот пример показывает наглядно как типом AnsiString можно легко осуществить склеивание нескольких строк перегруженной операцией сложения «+».
Пример поиска и замены фразы
Пример поиска в строке str1 фрагмента текста, который задан в строке str2. В метке Label2 будет выводиться текст с заменённой фразой.
AnsiString str1, str2;
str1 = Edit1->Text;
str2 = Edit2->Text;
int i = str1.Pos(str2); //Идёт поиск в строке str1 фраза из строки str2 и получаем индекс первого вхождения
if (i) Label2->Caption = str1.SubString(1, i - 1) + str1.SubString(i + str2.Length(), 255);
else Label2->Caption = "Текст не найден";
В примере были использованы функции-элементы класса AnsiString: Pos, Length, SubString. Доступ к элементам класса осуществляется с помощью операции точка (.), вместо операции доступа к методам компонентов стрелка (->). Т.е. в C++ Builder доступ к методам компонентов осуществляется с помощью указателя на объект, а в примере к методам класса AnsiString доступ идёт через сами объекты – строки.
Если при поиске была найдена фраза, то функция Pos() вернёт индекс первого символа в искомой строке. Если подстрока не будет найдена, то вернётся 0.
После получения значения функцией Pos() идёт проверка условной структурой «if...else» на возвращаемое значение – не равно ли оно нулю (false). Если не равно, то выполняется формирование строки str1 с заменой найденного фрагмента. Строка формируется путём склейки двух строк: начало строки str1 до найденного фрагмента, и конец строки str1 после найденного фрагмента. Для этого использовалась функция SubString, которая возвращает подстроку с указанными индексами (диапазон отображения строки).
Поиск и замена фразы через строки (char *) будет более сложной и потребуется объявлять дополнительный буфер для хранения изменённой строки.
Пример замены всех вхождений в строке AnsiString
AnsiString str1, str2;
str1 = Edit1->Text;
str2 = Edit2->Text;
int i = str1.Pos(str2), replace = 0;
while(i)
{
str1 = str1.SubString(1,i + replace - 1) + str1.SubString(i + replace + str2.Length(), 255);
replace += i - 1;
i = str1.SubString(replace + 1, 255).Pos(str2);
}
Label1->Caption = str1;
Пример поиска и замены функциями Delete и Insert
- Delete – позволяет удалить из строки любой кусок символов, начиная с позиции и размером в количество символов.
- Insert – позволяет вставить подстроку в любую часть строки, указав позицию вставки.
AnsiString str1, str2, str3;
str1 = Edit1->Text;
str2 = Edit2->Text;
int i = str1.Pos(str2), replace = 0;
while (i > replace)
{
str1.Delete(i, str2.Length());
str1.Insert(str3,i);
replace = i + str3.Length();
i = replace - 1 + str1.SubString(replace, 255).Pos(str2);
}
Label1->Caption = str1;
Преобразование от типа AnsiString к (char *)
Класс AnsiString намного удобнее и функциональнее чем (char *), но бывают случаи, когда при работе с некоторыми функциями требуется требуется передавать значения типа (char *). Это может быть связано с вызовом API функций ОС Windows или же функций среды разработки C++ Builder. Например, функции PlaySound или Application->MessageBox, которым требуется для передачи параметров тип (char *).
Преобразовать строку AnsiString в (char *) достаточно легко и быстро. Это делается с помощью функции c_str() класса AnsiString, которая преобразовывает строку:
str.c_str();
Пример обратного преобразования из (char *) в AnsiString
char ch[5];
AnsiString str;
str = AnsiString(*ch);
Функции класса AnsiString
Функция | Описание |
---|---|
Insert | Insert(const AnsiString& str, int index) Вставляет в строку str1 подстроку str2. Вставка подстроки начинается с index. |
Pos | Pos(const AnsiString& str) const Возвращает первый индекс первого вхождения строки str. Если str не содержит строка, то возвращается 0. Отсчёт индексов начинается с 1. |
IsEmpty | Если строка пустая, возвращается true. |
Delete | Delete(int index, int count) Из строки удаляется символы, начиная с index и размером символов count. |
Length | Вычисляет количество символов в строке. |
LowerCase | Переводит всю строку в нижний регистр. |
UpperCase | Переводит всю строку в верхний регистр. |
SubString | SubString(int index, int count) Выводит из строки str1 подстроку str2, начиная с index и размером символов count. |
SetLength | SetLength(int newLength) Обрезает строку AnsiString до указанного количества символов. Если newLength больше строки, то строка не изменится. |
ToDouble | Преобразует строку AnsiString в число с плавающей запятой. Если строку невозможно преобразовать (например символьная строка), то генерируется исключение. |
Tolnt | Преобразует строку AnsiString в целое число. Если строку невозможно преобразовать (например символьная строка), то генерируется исключение. |
Trim | Удаляет пробелы из начала и конца строки AnsiString. |
TrimLeft | Удаляет пробелы из начала строки AnsiString. |
TrimRight | Удаляет пробелы из конца строки AnsiString. |
c_str | Возвращает указатель с нулевым символом в конце char*. |
IsDelimiter | IsDelimiter(const AnsiString& delimiter, int index) const Если символ с индексом index соответствует delimiter, то возвращается true. В противном случае false. |