Содержание | Последнее обновление: 14.02.2004 |
Строки(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 |