Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VC Лекции PDF / VC 11 Лек Операции со строками

.pdf
Скачиваний:
34
Добавлен:
15.02.2015
Размер:
223.43 Кб
Скачать

Лекция 11

Операции со строками

1

 

Л Е К Ц И Я 1 1

 

ОПЕРАЦИИ СО СТРОКАМИ______________________________________________________________ 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 ) ; CString ( TCHAR ch , int nRepeat = 1 ) ; CString ( LPCTSTR lpch , int nLength) ; CString ( const unsigned char* psz ) ; CString ( LPCWSTR lpsz ) ;

CString ( LPCSTR lpsz ) ;

throw ( CMemoryException ) ; throw ( CMemoryException ) ; throw ( CMemoryException ) ; throw ( CMemoryException ) ; throw ( CMemoryException ) ; 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 [ ]

возвращает символ в заданной позиции (операторная реализация метода

SetAt ( )

GetAt ( ));

 

 

устанавливает символ в заданную позицию;

 

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++