Вы находитесь на странице: 1из 3

Лекция 11 Операции со строками 1

ЛЕКЦИЯ 11
ОПЕРАЦИИ СО СТРОКАМИ______________________________________________________________ 1
Конструкторы класса CString______________________________________________________________ 1
Функции класса CString __________________________________________________________________ 2
Пример использования функций класса CString ______________________________________________ 2

ОПЕРАЦИИ СО СТРОКАМИ
Если вы программировали на Бейсике или Паскале, вы знаете, как просто в этих языках работать со
строками. С другой стороны, функции работы со строками, заканчивающимися нулем, унаследованные
языком C++ из С, предоставляют не наилучший механизм работы с ними. Желание предоставить про-
граммистам простой и удобный способ работы со строками привело разработчиков MFC к созданию клас-
са CString.
Класс CString не имеет базового класса. Он состоит из последовательности символов переменной
длины и предоставляет функции и операторы, использующие синтаксис, сходный с реализованным в Бей-
сике. Тип символов, составляющих последовательность, объявлен как TCHAR. Это означает, что, если в
вашей программе определен символ _UNICODE, тип символов будет wchar_t ("широкие" символы, для
размещения которых требуется 16 бит). В противном случае тип символов определен как char (обычный 8-
битовый тип).
Объекты CString имеют следующие характеристики:
они могут увеличиваться в результате выполнения операции конкатенации;
вы можете представлять их себе как строки, а не как указатели на строки;
вы можете свободно передавать CString-объекты параметрам функций, имеющим тип const char*
или LPCTSTR;
оператор преобразования типа имеет возможность получить прямой доступ к символам, хранимым в
объекте, как к массиву символов (т.е. как к С-строке).
Если возможно, распределяйте память для объектов CString в стеке, а не в хипе. Это приводит к эко-
номии памяти и упрощает передачу параметров. Класс помогает вам экономить память, разрешая двум
строкам разделять один и тот же буфер для хранения символов. Однако если вы попытаетесь изменить
содержимое буфера непосредственно (не используя MFC), вы можете непреднамеренно изменить обе
строки. В связи с этим класс CString предоставляет два метода: LockBuffer ( ) и UnlockBuffег ( ), чтобы
защитить ваши данные. Когда вы вызываете метод LockBuffer ( ), вы создаете копию строки, хранящейся
в объекте, и устанавливаете счетчик ссылок равным -1, что приведёт к "блокированию" доступа к буферу.
Пока доступ к буферу блокирован, ни один строковый объект не может ссылаться на данные в нем, и сам
блокированный строковый объект не может ссылаться на другой строковый объект. По окончании работы
с данными вызовите метод UnlockBuffer ( ), чтобы установить значение счетчика ссылок, равным 1.

Конструкторы класса CString


В классе определено много форм конструкторов:
CString ( ) ;
CString ( const CString & stringSrc ) ; throw ( CMemoryException ) ;
CString ( TCHAR ch , int nRepeat = 1 ) ;throw ( CMemoryException ) ;
CString ( LPCTSTR lpch , int nLength) ; throw ( CMemoryException ) ;
CString ( const unsigned char* psz ) ; throw ( CMemoryException ) ;
CString ( LPCWSTR lpsz ) ; throw ( CMemoryException ) ;
CString ( LPCSTR lpsz ) ; throw ( CMemoryException ) ;
Конструктор по умолчанию инициализирует защищенный член-данное m_pchData пустым значением.
Вторая форма представляет собой конструктор копирования. Третья форма конструктора позволяет соз-
дать объект, содержащий nRepeat копий символа ch. Четвертая форма создает объект, используя массив
символов длины nLength (не завершающийся нулем), на который указывает параметр Ipch. Три послед-
ние формы конструктора используются для создания объекта на основе массивов символов. Любой из
конструкторов, за исключением конструктора по умолчанию, может вызывать исключение типа
CMemoryException в случае недостатка памяти для размещения копируемых данных. Заметим, что неко-
торые из конструкторов действуют как функции преобразования типа. Это позволяет вам, например, под-
ставлять строку типа LPTSTR, когда ожидается параметр типа CString. Вот несколько примеров конст-
руирования строковых объектов:
CString si ;

Выжол Ю.А. Программирование на Visual C++


Лекция 11 Операции со строками 2
CString s2 ("Строка символов") ;
CString s3 = s2; // конструктор копирования
CString s4 ( s2 + " " + s3 ) ;
CString s5 ( 'x', 4 ) ; // s5 = "xxxx"
// строка создана из строкового ресурса с идентификатором ID_FILE_NEW
CString s6 ((LPCSTR) ID_FILE_NEW ) ;
CString fileName = "test.dat"; // строка создана из LPCSTR-строки

Функции класса CString


В классе CString определены следующие функции:
GetLengt ( ) возвращает число символов в объекте (каждый символ занимает 1 байт);
GetBuffer ( ) возвращает указатель на буфер объекта (позволяет использовать его в
обычных функциях работы со строками);
ReleaseBuffer ( ) освобождает буфер, распределенный методом GetBuffer ( );
LoadString ( ) загружает строку из ресурсов приложения;
Compare ( ) сравнить две строки без учета регистра букв;
CompareNoCase ( ) сравнить две строки с учетом регистра букв;
Empty ( ) очищает строку;
GetAt ( ) возвращает символ в заданной позиции;
operator [ ] возвращает символ в заданной позиции (операторная реализация метода
GetAt ( ));
SetAt ( ) устанавливает символ в заданную позицию;
IsEmpty ( ) проверяет, пуст ли строковый объект;
Find ( ) находит подстроку и возвращает индекс первого ее символа;
Format ( ) преобразует данные других типов в текст, подобно функции sprintf ( );
Left ( ) выделяет заданное количество самых левых символов в строке;
Right ( ) выделяет заданное количество самых правых символов в строке;
Mid ( ) выделяет заданное количество символов, начиная с указанного;
TrimLeft ( ) удаляет ведущие пробелы из строки;
TrimRight ( ) удаляет хвостовые пробелы из строки;
Spanlncluding ( ) выделяет подстроку, состоящую только из символов, содержащихся в за-
данном списке;
SpanExcluding ( ) выделяет подстроку, состоящую только из символов, не содержащихся в
заданном списке;
MakeLower ( ) преобразует все символы в строчные;
MakeUpper ( ) преобразует все символы в прописные;
MakeReverse ( ) обращает порядок символов в строке;
AnsiToOem ( ) осуществляет преобразование символов буфера из ANSI- в OEM-набор
символов;
OemToAnsi ( ) осуществляет преобразование символов буфера из OEM- в ANSI-набор
символов;
operator LPCTSTR осуществляет непосредственный доступ к символам, хранимым в объекте,
как к С-строке;
Кроме того, класс содержит перегруженные операторы сравнения < , <= , — , > , >= , != , а также опе-
раторы вставки << и извлечения из потока >>. Оператор LPCTSTR позволяет получить указатель на
строку, содержащуюся в объекте CString. Это позволяет передавать объекты CString параметрам, ожи-
дающим аргументы типа LPCTSTR. Заметим, однако, что при передаче объекта CString функции с пере-
менными аргументами, такой, как printf ( ), необходимо использовать явное преобразование типа с по-
мощью оператора LPCTSTR. Для обратного преобразования предусмотрен конструктор, принимающий
указатель на строку LPCTSTR.

Пример использования функций класса CString


Приведенный ниже фрагмент кода демонстрирует работу с объектами класса CString:
CString str ("abcdef") ;
ASSERT ( str.GetLength ( ) = 6 ) ;

Выжол Ю.А. Программирование на Visual C++


Лекция 11 Операции со строками 3
ASSERT ( str.GetAt ( 2 ) == ’c’ ) ;
CString s ("abc") ;
ASSERT (s [ l ] == 'b') ;
s.Empty ( ) ;
ASSERT ( s.GetLength ( ) = 0 ) ;
str = _T ("замечательный язык") ;
TCHAR szBuf [1024] ;
Если прототип функции известен компилятору, то оператор LPCTSTR будет вызван неявно.
strcpy ( szBuf , str ) ;
Если прототип не известен (например, вы передаете строку необязательному параметру или это
функция с переменным числом аргументов), то вы должны осуществить явное преобразование типа.
Sprintf ( szBuf , "Я думаю, что %s!\n", (LPCTSTR) str ) ;
С другой стороны, если заранее известно, что тип параметра есть LPCTSTR, в явном преобразова-
нии типа нет необходимости.
sprintf ( szBuf , str ) ;
cout << str ;
str.Format ( ) ;
CString si , s2 ;
s1 = "123456";
s2 = s1 ;
s1 = "номер " + s1 ;
s1 = 'x';
s1 = "abc"; s2 = "def";
ASSERT (( si + s2 ) = "abcdef") ;
CString s3 ;
s3 = CString ("abc") + "def" ;
ASSERT (( s1 += "def") = "abcdef") ;
s1 = "abc"; s2 = "abd";
ASSERT ( si < s2) ;
ASSERT ("ABC" < s1 ) ;
ASSERT ( s2 > "abe" ) ;
Необходимо обратить внимание на одну тонкость при работе с методом Format ( ). По умолчанию он
работает только со строками, длина которых не превышает 128 байтов. Для форматирования строк
большего размера необходимо предварительно вызвать метод GetBuffer ( ), как показано в приводи-
мом ниже примере:
CString str ;
str.GetBuffer (1024 ) ;
str.Format ("%s", strSomeBigString ) ;
Поскольку содержимое буфера, полученного с помощью метода GetBuffer ( ), в этом случае не изме-
няется, нет необходимости вызывать метод ReleaseBuffer ( ).

Выжол Ю.А. Программирование на Visual C++

Вам также может понравиться