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());
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.