Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

Класс AnsiString

В VCL для представления текстовых строк используются не символьные массивы и не шаблон стандартной библиотеки, а строки Object Pascal. Кроме того, многие свойства компонентов представлены множествами этого языка. Для моделирования таких объектов C++Builder реализует классы AnsiString и Set. Рассмотрим краткое описание этих классов.

Класс AnsiString

Для начала краткая информация. 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

Функции библиотеки Builder C++ требуют, чтобы строки передавались им в виде символьных массивов. В 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

Класс AnsiString определяется в заголовке dstring.h. Конструктор этого класса перегружен, так что строки можно инициализировать различными способами - другой строкой, строкой С (указателем на char), а также целыми типами. В последнем случае строка будет содержать текстовое представление числа.

Методы

Мы не будем приводить здесь полное описание всех методов AnsiString, а расскажем только о важнейших.

  • int _fastcall AnsiCompare(const AnsiStringfi rhs) const;

Этот метод производит сравнение строки с указанной строкой. Сравнение производится в соответствии с текущим локалом Windows, т. е., например, в русифицированной системе сравнение строк с русским текстом должно давать правильный результат. (Честно говоря, я этого не проверял.) Соответственно результат сравнения может отличаться от результата операций сравнения, которые производятся исходя из ASCII-значений символов.

  • int _fastcall AnsiPos(const AnsiStringS subStr) const;

Метод возвращает позицию указанной подстроки. Первому символу строки соответствует 1. Нулевой результат означает, что подстрока не найдена.

  • char* _fastcall с str() const;

Возвращает указатель на ограниченную нулем строку С (символьный массив). Если строке ничего не присвоено, возвращается указатель на пустую строку.

  • const void* fastcall data() const { return Data; } Аналогичен предыдущему, но возвращает нулевой указатель в случае неприсвоенной строки.

  • AnsiString& _fastcall Delete(int index, int count); Удаляет заданное число символов начиная с указанной позиции. Позиция 1 соответствует первому символу строки.

  • static AnsiString _fastcall FloatToStrF(long double value, TStringFloatFormat format, int precision, int digits) ;

Производит преобразование числа с плавающей точкой в текстовую форму в соответствии с указанным форматом.

  • AnsiString& _fastcall Insert(const AnsiString& sir, int index) ;

Вставляет строку в указанной позиции (1 - перед первым символом). Если индекс меньше 1, он считается единицей.

  • static AnsiString fastcall IntToHex(int value,int digits) ;

Преобразует число в строку с представлением его в виде щестнадцате-ричных цифр. Второй параметр указывает минимальное число цифр. Аналогичен Pos, но допускает многобайтовые символы.

  • bool _fastcall IsDelimiter (const AnsiString& delimiters, int index) const;

Проверяет, входит ли символ в позиции index в указанную строку delimiters.

  • bool _fastcall IsEmptyO const;

Возвращает true, если строка пустая.

  • int _fastcall LastDelimiter (const AnsiString& delimiters) const;

Возвращает позицию последнего из символов строки, входящих в указанную строку ограничителей.

  • int _fastcall Length() const;

Возвращает число байтов в строке.

  • static AnsiString fastcall LoadStr(int ident) ;

Загружает строку строковым ресурсом исполняемого файла. Если ресурса с указанным идентификатором не существует, возвращается пустая строка.

  • AnsiString _fastcall Lowercase() const;

Возвращает строку, преобразованную в нижний регистр в соответствии С Текущим ЛОКалом Windowa. He сохраняет исходную строку.

  • int _fastcall Pos(const AnsiString& subStr) const;

Возвращает позицию указанной подстроки.

  • int _cdecl printf(const char* format, ...);

Формирует строку в соответствии со стандартным форматом С. Возвращает длину строки-результата.

  • AnsiString& _fastcall SetLength(int newLength) ;

Устанавливает новую длину строки, перераспределяя память под ее символьный массив. В новый массив копируется исходное содержимое строки. Если новая длина меньше исходной, строка усекается.

  • AnsiString& cdecl sprintf(const char* format, ...);

To же, что и printf (), но возвращается ссылка на модифицированную строку (*this).

  • StringOfChar()

Функция StringOfChar создает новую строку длиной RepeatCount, заполненную символами RepeatCharacter.Эта функция избавляет вас от необходимости создания цикла или утомительного ручного набора.

  • AnsiString fastcall Substring(int index, int count) const; Возвращает подстроку с указанной позицией и длиной.

  • AnsiString _fastcall Substring(int index, int count) const; Преобразует строку в число двойной точности. Если строка не содержит корректного представления числа с плавающей точкой, выбрасывается исключение EConvertError.

  • int _fastcall Tolnt() const; Преобразует строку в целое. Если строка не содержит корректного представления числа, выбрасывается исключение EConvertError.

  • int _fastcall ToIntDef(int defaultValue) const; Преобразует строку в целое. Если строка не содержит корректного представления числа, возвращается указанное значение по умолчанию.

  • AnsiString fastcall Trim() const; Возвращает строку с удаленными начальными и конечными пробелами и управляющими символами.

  • AnsiString fastcall TrimLeft() const; Возвращает строку с удаленными начальными пробелами и управляющими символами.

  • AnsiString _fastcall TrimRight() const; Возвращает строку с удаленными конечными пробелами и управляющими символами.

  • AnsiString _fastcall Uppercase() const; Возвращает строку, преобразованную в верхний регистр в соответствии с текущим локалом Windows. He изменяет исходную строку. В классе AnsiString реализованы операции присваивания, сложения (возвращает конкатенацию строк), индексации (возвращает символ с указанным индексом) и отношений (сравниваются ASCII-значения входящих В строку символов).