基本 CString 操作
本主题介绍以下基本 CString 操作:
Class CString
基于类模板 CStringT 类。 CString
是 CStringT
的一个 typedef
。 更确切地说,CString
是对 CStringT
的显式专用化的 typedef
,它是使用类模板来定义类的常见方法。 进行类似定义的类是 CStringA
和 CStringW
。
CString
、CStringA
和 CStringW
在 atlstr.h 中定义。 CStringT
在 cstringt.h 中定义。
CString
、CStringA
和 CStringW
都获得一组由 CStringT
定义的方法和运算符,可以与支持的字符串数据配合使用。 某些方法重复,在某些情况下优于 C 运行时库的字符串服务。
注意:CString
是原生类。 对于用在 C++/CLI 托管项目中的字符串类,请使用 System.String
。
从标准 C 文本字符串创建 CString 对象
可以将 C 样式的文本字符串分配给一个 CString
,正如你可以将一个 CString
对象分配给另一个一样。
将 C 文本字符串的值分配给
CString
对象。CString myString = _T("This is a test");
将一个
CString
的值分配给另一个CString
对象。CString oldString = _T("This is a test"); CString newString = oldString;
将一个
CString
对象分配给另一个时,将复制CString
对象的内容。 因此,这两个字符串不共享对构成字符串的实际字符的引用。 若要详细了解如何使用CString
对象作为值,请参阅 CString 语义。注意
若要编写应用程序,以便可以针对 Unicode 或 ANSI 编译该应用程序,请使用 _T 宏对文本字符串进行编码。 有关详细信息,请参阅 Unicode 和多字节字符集 (MBCS) 支持。
访问 CString 中的单个字符
可以使用 GetAt
和 SetAt
方法访问 CString
对象中的单个字符。 还可以使用数组元素(或下标)运算符 ( [ ] ) 而非 GetAt
来获取单个字符。 (这类似于按索引访问数组元素,正如在标准 C 样式字符串中所做的那样)CString
字符的索引值从零开始。
连接两个 CString 对象
若要连接两个 CString
对象,请使用连接运算符(+ 或 +=),如下所示。
CString s1 = _T("This "); // Cascading concatenation
s1 += _T("is a ");
CString s2 = _T("test");
CString message = s1 + _T("big ") + s2;
// Message contains "This is a big test".
连接运算符(+ 或 +=)的至少一个参数必须是 CString
对象,但你可以对另一个参数使用常量字符串(例如 "big"
)或 char
(例如“x”)。
比较 CString 对象
Compare
方法和 CString
的 == 运算符等效。 Compare
、运算符 == 和 CompareNoCase
是 MBCS 和 Unicode 感知型;CompareNoCase
也不区分大小写。 CString
的 Collate
方法区分区域设置,其速度通常比 Compare
慢。 Collate
仅在你必须遵守当前区域设置指定的排序规则的地方使用。
下表显示了可用的 CString 比较函数及其在 C 运行时库中的等效 Unicode/MBCS 可移植函数。
CString 函数 | MBCS 函数 | Unicode 函数 |
---|---|---|
Compare |
_mbscmp |
wcscmp |
CompareNoCase |
_mbsicmp |
_wcsicmp |
Collate |
_mbscoll |
wcscoll |
CStringT
类模板定义关系运算符(<、<=、>=、>、== 和 !=),可供 CString
使用。 可以使用这些运算符比较两个 CStrings
,如以下示例所示。
CString s1(_T("Tom"));
CString s2(_T("Jerry"));
ASSERT(s2 < s1);
转换 CString 对象
若要了解如何将 CString 对象转换为其他字符串类型,请参阅如何:在各种字符串类型之间进行转换。
将 CString 与 wcout 配合使用
若要将 CString 与 wcout
配合使用,必须以显式方式将该对象强制转换为 const wchar_t*
,如以下示例所示:
CString cs("meow");
wcout << (const wchar_t*) cs << endl;
如果没有强制转换,则会将 cs
视为 void*
,wcout
会输出对象的地址。 此行为是由模板参数推导与重载解析之间的细微交互引起的,它们本身正确且符合 C++ 标准。