AnsiString - класс динамической строки

Страницы работы

Содержание работы

AnsiString - класс динамической строки емкостью до 232-1 символов. Базой для создания этого класса послужил паскалевский тип String, который был расширен в соответствии с возможностями C++.

AnsiString – строка символов переменной размера. Вспомним как в си представляется строка :

Строка это массив символов ограниченный завершающим символом ‘\n’ (символ конца строки или символ перевода каретки).

Символьным типом данных в си является тип char (один символ),  соответственно массив символов : char str[256]; - таким образом объявили массив из 256 символов, но он строкой ещё не является, т.к. не содержит в нутрии себя ничего и не ограничен завершающим символом.

Запись данных в такую «строку» можно осуществить следующим образом - посимвольно занося элементы в массив : str[0]='a'; str[1] = 'b'; str[2] = 'c'; ….. str[33] = '\n';

Ту же операцию выполняет функция strcpy(str,”abcdefg”); - она посимвольно скопирует содержимое строки в str (в данном случае в качестве копируемой строки выступает строковая константа ”abcdefg”  ), функция скопирует содержимое и в конце строки назначения поставит завершающий символ '\n'.

Кроме того есть ещё ряд функций работающий со строками char : strcat, strcmp …

При работе со строками char всегда необходимо помнить тот факт, что работам с массивом символов, а при работе с AnsiString этого помнить не нужно, рассмотрим пример :

char str1[256];

AnsiString str2;

str1 = “stroka1”;

str2 = “stroka2”;

в данном случае операция str1 = “stroka1”; будет ошибочна, т.к. здесь идёт присваивание массиву константы (необходимо посимвольное копирование, но операция “=“ посимвольного копирования не производит ), вместо этого для строк char придётся вызывать функцию strcpy(str1, “stroka1”). В случае со строкой AnsiString всё проще, т.к. операция присваивания производит именно посимвольную запись внутрь строки AnsiString. Сделаем вывод в строки AnsiString удобней записывать содержимое, но на этом достоинства AnsiString не заканчиваются, рассмотрим их :

1)  Присваивание :

AnsiString str1;

str1 = “123456”;

2)  Склейка строк :

AnsiString str1, str2, str3;

str1 = “123456”;

str2 = “abcdefg”;

str3 = str1 + str2;

в результате в строке str3 будет содержатся : “123456abcdefg”;

Также для склейка строк может быть проведена с помощью оператора +=

str3 += str1;

тогда в str3 будет содержатся “123456abcdefg123456”;

3)  Использование встроенных в класс AnsiString функций:

AnsiString str1 = “11”;

int a = str1.ToInt(); //Преобразование строки в целое число

str1 = “11,1”;

double b = str1.ToDouble(); //Преобразование строки в число с плавающей точкой

В данном примере обратите внимание, что в качестве разделителя в строке используется запятая.

int len = str1.Length(); //вычисление длины строки AnsiString

4)  Форматированная запись в строку :

double b = 3.1234;

str1.sprintf(“%3.2lf”,b);

После выполнения данной функции в str1 ,будет содержатся 3.12, формат тот же, что и у функции printf из стандартной библиотеки ввода-вывода

5)  Удаление подстроки :

AnsiString buf = “123456abcdefg”;

buf.Delete(1,6) ; //удалить из строки buf 6 символов начиная с первого

В результате в строке останется только “abcdefg”; Внимание в строках AnsiString нумерация символов начинается с 1 а не с 0 как это принято в си (это связано с тем, что строки AnsiString скопированы с Delphi, синтаксис которого основан на языке Pascal там нумерация идёт с 1).

6)  Поиск подстроки :

AnsiString str1;

str1 = "123456abcdefg";

int a = str1.Pos("ab");

Функция Pos вернёт  номер символа вхождения подстроки в исходной строке, если подстрока не найдена, то функция вернёт 0 (тут тоже важно помнить, что 0 – это не нулевой, то есть начальный символ, если подстрока начинается с 1-го символа то функция вернёт 1!). Кроме того например мы ищем подстроку "11" в строке "11aa11dddd" видим, что подстрока встречается 2 раза, в данном случае функция Pos вернёт номер вхождения 1-ой подстроки.

Рассмотрим пример : сколько раз встретится подстрока в исходной строке :

AnsiString str1, str2, buf;

str1 = "a11b11c11d11e11f11g";

str2 = "11";

 int counter = 0; //счётчик вхождений подстроки

 buf = str1; //копируем строку в промежуточную

 while(1)

{

     if(buf.Pos(str2) != 0)

     {

        counter++; //нарасчиваем счётчик

        buf.Delete(buf.Pos(str2),str2.Length()); //удаляем найденное вхождение

     }

     else

     {

       break; //если вхождений подстроки больше не встретилось завершаем цикл

     }

}

7)  Вставка подстроки

AnsiString str1;

str1 = "123456abcdefg";

str1.Insert("@@@@@",6);

вставим подстроку "@@@@@" в str1 с 6 символа

8)  Преобразование в char

Во многих случаях требуется преобразовать строку AnsiString в char, например для использования данной строки в стандартных функциях ввода-вывода,  :

AnsiString str1;

str1 = "123456abcdefg";

puts(str1.c_str());

тот же пример с использованием printf :

printf(“%s\n”, str1.c_str());

9)  Выделение подстроки (начиная с нужного символа, определенной длины) :

AnsiString str1;

str1 = "123456abcdefg";

AnsiString str2 = str1.SubString(2,3);

В результате в str2 будет «234»

10)  Заполнение строки символами :

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

AnsiString str1;

str1 = str1.StringOfChar('f',10);

В str1 получим : “ffffffffff”

Кроме того есть ещё функция которая возвращает последний символ в строке (который стоит перед \n)

char *c = str1.AnsiLastChar();

11)  Операторы сравнения.

Сроки типа char мы сравнивали при помощи функции strcmp, для сравнения строк AnsiString используются операторы ==, >, >=

“==” проверяет строки на посимвольное равенство и равенство по длине

“>” сравнивает строки посимвольно ориентируясь на положение символа в таблице ASCII

Например :

AnsiString buf1 = "acc";

AnsiString buf2 = "bb";

if(buf1 > buf2) puts("da");

else puts("net");

получаем ответ «net» т.к. первый символ строки buf1 'a' стоит в кодовой таблице (по алфавиту) раньше, чем 1-ый символ строки buf2

AnsiString buf1 = "ccc";

AnsiString buf2 = "bb";

if(buf1 > buf2) puts("da");

else puts("net");

в данном случае получаем ответ 'da' т.к. первый символ buf1 'c' по алфавиту стоит дальше, чем ‘b’.

12)  Доступ к символам строки по индексу : В случае AnsiString мы используем тот же оператор доступа по индексу [], что и со строками char, но при этом обязательно нужно помнить, что нумерация в AnsiString идет с 1!

Рассмотрим пример – в строку buf2 нужно записать все символы из строки buf1 с чётными номерами :

AnsiString buf1 = "123456";

AnsiString buf2;

for(int i = 1; i <= buf1.Length(); i++)

 {

     if(i % 2 == 0)

     {

       buf2 += buf1[i];

     }

 }

В результате получим в buf2 “246”;

Другой пример – зеркальный переворот строки :

AnsiString buf1 = "abcdefg";

   AnsiString buf2;

   for(int i = buf1.Length(); i != 1; i--)

   {

        buf2 += buf1[i];

   }

  puts(buf2.c_str());

В результате на экран будет выведено gfedcba.

Перестановка символов местами :

AnsiString buf1 = "a1b2c3d4e5f6g7";

   for(int i = 1; i <= buf1.Length(); i = i + 2)

   {

      char c = buf1[i];

      buf1[i] = buf1[i+1];

      buf1[i+1] = c;

   }

   puts(buf1.c_str());

Похожие материалы

Информация о работе