与 C 样式字符串相关的 CString 操作(msdn)
将 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
使用标准运行时库字符串函数
在大多数情况下,应该能够找到 CString 成员函数来执行任何字符串操作,为了进行这种操作,您可能会考虑使用标准 C 运行时库字符串函数,如 strcmp(或可移植 Unicode/MBCS 的 _tcscmp)。
如果需要使用 C 运行时字符串函数,可使用转换成 C 样式空终止字符串中所描述的技术来将 CString 对象复制到一个等效的 C 样式字符串的缓冲区,在该缓冲区执行操作,然后将得到的 C 样式字符串分配回 CString 对象。
直接修改 CString 的内容
在大多数情况下,应使用 CString 成员函数来修改 CString 对象的内容或将 CString 转换为一个 C 样式的字符串。
但是,在某些情况下,比如使用需要字符缓冲区的操作系统函数,直接修改 CString 内容是较为有利的。
GetBuffer 和 ReleaseBuffer 成员函数使您能够访问 CString 对象的内部字符缓冲区,并直接进行修改。以下步骤显示如何使用这些函数来达到这一目的:
- 为 CString 对象调用 GetBuffer,并指定所需缓冲区的长度。
- 使用由 GetBuffer 返回的指针来直接将字符写入 CString 对象中。
- 调用 CString 对象的 ReleaseBuffer 来更新所有的内部 CString 状态信息,如字符串的长度。直接修改完 CString 对象的内容之后,在调用任何其他 CString 成员函数之前必须调用 ReleaseBuffer。
对 CString 对象使用变量参数函数
有些 C 函数采用数量不定的参数。一个明显的示例是 printf。由于这种函数声明的方式,编译器无法确定参数的类型,并且无法确定在每个参数上执行哪种转换操作。因此,当将 CString 对象传递给采用数量不定的参数的函数时,使用显式类型转换是十分重要的。
在变量参数函数中使用 CString 对象
- 将 CString 显式转换为 LPCTSTR 字符串,如下所示:
CString kindOfFruit = "bananas";
int howmany = 25;
printf( "You have %d %s ", howmany, (LPCTSTR)kindOfFruit );
对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (LPCTSTR) 而非 CString 的 const 指针。当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 ["hi there"
])或传递到 CString 对象。CString 对象将自动转换成 LPCTSTR。任何能够使用 LPCTSTR 的地方也能够使用 CString 对象。
如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即 const CString&)。如果函数要修改该字符串,则删除 const 修饰符。如果需要默认为空值,则将其初始化为空字符串 [""
],如下所示:
const CString& address,
const CString& comment = "" );
对于大多数函数结果,按值返回 CString 对象即可。