Строки(AnsiString) - общие вопросы
Автор: trainer
Исходная ссылка: - - -
Для начала краткая информация
AnsiString - класс динамической строки емкостью до 232-1 символов. Базой для создания этого класса послужил паскалевский тип String, который был расширен в соответствии с возможностями C++.
Особенностью его является то, что два экземпляра этого класса могут физически занимать один и тот же участок памяти.
Экземпляр этого класса содержит счетчик ссылок к нему, когда этот счетчик обнуляется, экземпляр автоматически уничтожается.
Если попытаться изменить экземпляр, к которому имеется более одной ссылки, то будет создана новая копия этой строки, которая и будет изменяться. Это уменьшает портебность программы в памяти, но и уменьшает скорость обработки.
Наследием Паскаля является также то, что символы в нем нумеруются с 1, а не с 0, как это принято в C/C++
Создание строки
Благодаря наличию перегруженных конструкторов строку можно создавать из большого количества базовых типов языка C++, например:
AnsiString empty_string; /* пустая строка */
AnsiString one = 1; /* строка one будет содержать "1" */
AnsiString one_and_half = 1.5; /* в one_and_half содержится строка "1.5" */
AnsiString one_charachter = 'a'; /* в one_charachter содержится строка "a" */
AnsiString dup_string = AnsiString::StringOfChar('A',5); /* dup_string получит значение "AAAAA" */
AnsiString simply_string = "string";
AnsiString shorten("Длинная строка",7); /* в shorten попадут только первые 7 символов */
получение символа из строки
Получить символ из строки типа AnsiString можно с помощью индексного оператора:
AnsiString ansi_string = "Строка";
char character = ansi_string[1]; /* получаем самый первый символ */
ansi_string[6] = 'и'; /* заменим 6-й на букву 'и' */
Получение символьного массива, содержащего значение AnsiString
Функции библиотеки исполнения C и функции WinAPI требуют, чтобы строки передавались им в виде символьных массивов.
В AnsiString для этого предназначены функции c_str и data. Разница между ними в том, что для пустой строки c_str возвращает "", а data - NULL. Это отличие может быть проиллюстрировано следующим примером:
AnsiString ansi_string;
char * str1 = ansi_string.c_str();
char * str2 = (char *)ansi_string.data();
Копирование значения AnsiString в символьный массив Unicode
Для этого предназначена функция WideChar, а размер требуемого массива можно узнать, воспользовавшись функцией WideCharBufSize
AnsiString ansi_string = "Строка AnsiString"; /* наша строка */
wchar_t * UnicodeString = new wchar_t[ansi_string.WideCharBufSize()]; /* массив-получатель */
ansi_string.WideChar(UnicodeString,ansi_string.WideCharBufSize());
// используем полученную строку, затем удаляем
delete [] UnicodeString;
Как узнать, сколько символов в строке?
Для этого надо воспользоваться функцией Length.
Как удалить в строке концевые пробелы?
Это делают функции Trim, TrimLeft и TrimRight соответственно с обоих концов, только с начала и только с конца.
Работа с фрагментами строки
AnsiString предоставлякт возможность поиcка(Pos), вставки(Insert), удаления(Delete) и получения копии(SubString) фрагмента текста в строке:
AnsiString ansi_string = "Строка";
int index = ansi_string.Pos("ка"); /* найдем окончание слова */
if( index != 0 ) {
ansi_string.Insert("чеч",index); /* теперь строка имеет вид "Строчечка" */
ansi_string.Delete(index,2); /* а теперь - "Строчка" */
}
Как зарезервировать строке определенный размер
Иногда бывает нужно зарезервировать для строки пространство, достаточное для хранения определенного количества символов. Сделать это можно при помощи функции SetLength
|