· 将 C 字符串的值分配到
CString对象:
CString myString = "This is a test";
· 将一个
CString的值分配到另一个 CString对象:
CString oldString = "This is a test";
CString newString = oldString;
访问 CString 中的单个字符
可使用
GetAt和 SetAt成员函数来访问 CString对象中的单个字符。还可使用数组元素、下标、运算符 ( [ ] )(而不是 GetAt)来获取单个字符,这与按索引来访问数组元素相似,正如在标准的 C 样式字符串中那样)。CString 字符的引索值是从零开始的。
并置两个 CString 对象
要并置两个
CString对象,请使用串联运算符(+ 或 +=),如下所示:
CString s1 = "This "; // Cascading concatenation
s1 += "is a ";
CString s2 = "test";
CString message = s1 + "big " + s2;
// Message contains "This is a big test".
必须至少有一个串联运算符(
+ 或
+=)的参数是 CString对象,但是能够为其他参数使用常数字符串(如
"big")或 char(如“x”)。
比较
CString
对象
Compare 成员函数和
CString的 ==运算符是等效的。Compare、operator== 和 CompareNoCase可识别 MBCS 和 Unicode;并且 CompareNoCase不区分大小写。CString 的 Collate成员函数区分区域性,并且常常要比 Compare慢。仅当有必要遵守当前区域指定的排序规则时,才应使用 Collate。
下面的表显示了可用的 CString 比较函数及其在 C 运行时库中等效的可移植 Unicode/MBCS 函数:
|
CString
函数
|
MBCS
函数
|
Unicode
函数
|
|
Compare
|
_mbscmp
|
wcscmp
|
|
CompareNoCase
|
_mbsicmp
|
_wcsicmp
|
|
Collate
|
_mbscoll
|
wcscoll
|
CString 类重写关系运算符(
<,
<=,
>=,
>,
== 和
!=)。可使用这些运算符来比较两个 CString,如下所示:
CString s1( "Tom" );
CString s2( "Jerry" );
if( s1 < s2 )
...
CString
语义
虽然 CString 对象是能够增长的动态对象,但它们的行为与内置基元类和简单类一样。每个
CString对象表示一个唯一的值。应将 CString对象视为实际字符串而不是指向字符串的指针。
您可以将一个
CString 对象分配给另一个 CString 对象。但是,当您修改其中一个 CString对象时,将不会修改另一个 CString对象,如以下示例所示:
CString s1, s2;
s1 = s2 = "hi there";
if( s1 == s2 )
// TRUE - they are equal
...
s1.MakeUpper();
// Does not modify s2
if( s2[0] == 'h' )
// TRUE - s2 is still "hi there"
请注意,在示例中,这两个
CString对象被视为是“平等”的,因为它们表示相同的字符串。CString 类重载相等运算符 (==),以便根据两个 CString对象的值(内容)比较它们,而不是根据标识(地址)。
与
C
样式字符串相关的
CString
操作
将 CString 对象的内容当作 C 样式的空终止字符串来操作,常常是很有用的。本文阐述了以下主题:
转换成
C
样式空终止字符串
请考虑以下两种情况:
· 在最简单的情况下,可以将
CString对象转换成 LPCTSTR。LPCTSTR 类型转换运算符从 CString对象返回指向只读的 C 样式空终止字符串的指针。
由
LPCTSTR返回的指针指入由 CString使用的数据区域。如果 CString离开了这个范围并且被自动删除,或其他原因更改了 CString 的内容,那么 LPCTSTR指针将不再有效。请将该指针指向的字符串视为临时的。
· 可使用
CString函数(如 SetAt)来修改字符串对象中的单个字符。但是,如果需要可直接修改的 CString对象字符的副本,那么请使用 strcpy(或可移植 Unicode/MBCS 的 _tcscpy)来将 CString对象复制到单独的缓冲区,在那里可安全地修改字符串,如以下示例中所示:
· CString theString( "This is a test" );
· LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
· _tcscpy(lpsz, theString);
//... modify lpsz as much as you want
注意
strcpy(或可移值 Unicode/MBCS 的
_tcscpy)的第二个参数是 const wchar_t*或 const char*。以上示例为该参数传递一个 CString。C++ 编译器自动将为应用转换函数,该转换函数是为将 CString转换为 LPCTSTR的 CString类定义的。定义从一种类型到另一种类型的转换操作的能力是 C++ 最为有用的功能之一。 (ANSI) (Unicode)
使用标准运行时库字符串函数
在大多数情况下,应该能够找到
CString成员函数来执行任何字符串操作,为了进行这种操作,您可能会考虑使用标准 C 运行时库字符串函数,如 strcmp(或可移植 Unicode/MBCS 的 _tcscmp)。
如果需要使用 C 运行时字符串函数,可使用
转换成 C 样式空终止字符串中所描述的技术来将 CString对象复制到一个等效的 C 样式字符串的缓冲区,在该缓冲区执行操作,然后将得到的 C 样式字符串分配回 CString对象。
直接修改
CString
的内容
在大多数情况下,应使用
CString成员函数来修改 CString对象的内容或将 CString转换为一个 C 样式的字符串。
但是,在某些情况下,比如使用需要字符缓冲区的操作系统函数,直接修改
CString内容是较为有利的。
GetBuffer 和
ReleaseBuffer成员函数使您能够访问 CString对象的内部字符缓冲区,并直接进行修改。以下步骤显示如何使用这些函数来达到这一目的:
1. 为
CString对象调用 GetBuffer,并指定所需缓冲区的长度。
2. 使用由
GetBuffer返回的指针来直接将字符写入 CString对象中。
3. 调用
CString对象的 ReleaseBuffer来更新所有的内部 CString状态信息,如字符串的长度。直接修改完 CString对象的内容之后,在调用任何其他 CString成员函数之前必须调用 ReleaseBuffer。
对
CString
对象使用变量参数函数
有些 C 函数采用数量不定的参数。一个明显的示例是
printf。由于这种函数声明的方式,编译器无法确定参数的类型,并且无法确定在每个参数上执行哪种转换操作。因此,当将 CString对象传递给采用数量不定的参数的函数时,使用显式类型转换是十分重要的。
在变量参数函数中使用
CString
对象
· 将
CString显式转换为 LPCTSTR字符串,如下所示:
· CString kindOfFruit = "bananas";
· int
howmany = 25;
printf( "You have %d %s/n", howmany, (LPCTSTR)kindOfFruit );
指定
CString
形参
对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (
LPCTSTR) 而非
CString的 const指针。当将形参指定为指向字符的 const指针时,可将指针传递到 TCHAR数组(如字符串 ["hi there"])或传递到 CString对象。CString 对象将自动转换成 LPCTSTR。任何能够使用 LPCTSTR 的地方也能够使用 CString对象。
如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即
const CString&)。如果函数要修改该字符串,则删除 const修饰符。如果需要默认为空值,则将其初始化为空字符串 [""],如下所示:
void AddCustomer( const CString& name,
const CString& address,
const CString& comment = "" );
对于大多数函数结果,按值返回
CString对象即可。
本文详细介绍了CString类的各种操作方法,包括字符串赋值、拼接、字符访问、比较等基本功能,以及如何将CString转换为C风格字符串进行标准库函数操作。
2027

被折叠的 条评论
为什么被折叠?



