Учись программированию на C++ Builder бесплатно!
Тип строк AnsiString

В 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.
Поделиться