惨淡经营

想不被别人淘汰,先得学会自己淘汰自己!

导航

与 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
    注意
       strcpy(或可移值 Unicode/MBCS 的 _tcscpy)的第二个参数是 const wchar_t* (Unicode) 或 const char* (ANSI)。以上示例为该参数传递一个 CString。C++ 编译器自动将为应用转换函数,该转换函数是为将 CString 转换为 LPCTSTRCString 类定义的。定义从一种类型到另一种类型的转换操作的能力是 C++ 最为有用的功能之一。

使用标准运行时库字符串函数

在大多数情况下,应该能够找到 CString 成员函数来执行任何字符串操作,为了进行这种操作,您可能会考虑使用标准 C 运行时库字符串函数,如 strcmp(或可移植 Unicode/MBCS 的 _tcscmp)。

如果需要使用 C 运行时字符串函数,可使用转换成 C 样式空终止字符串中所描述的技术来将 CString 对象复制到一个等效的 C 样式字符串的缓冲区,在该缓冲区执行操作,然后将得到的 C 样式字符串分配回 CString 对象。

直接修改 CString 的内容

在大多数情况下,应使用 CString 成员函数来修改 CString 对象的内容或将 CString 转换为一个 C 样式的字符串。

但是,在某些情况下,比如使用需要字符缓冲区的操作系统函数,直接修改 CString 内容是较为有利的。

GetBufferReleaseBuffer 成员函数使您能够访问 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 ", howmany, (LPCTSTR)kindOfFruit ); 
    指定 CString 形参

对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (LPCTSTR) 而非 CStringconst 指针。当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 ["hi there"])或传递到 CString 对象。CString 对象将自动转换成 LPCTSTR。任何能够使用 LPCTSTR 的地方也能够使用 CString 对象。

如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即 const CString&)。如果函数要修改该字符串,则删除 const 修饰符。如果需要默认为空值,则将其初始化为空字符串 [""],如下所示:

void AddCustomer( const CString& name,
                    
const CString& address,
                    
const CString& comment = "" ); 

对于大多数函数结果,按值返回 CString 对象即可。

posted on 2004-09-24 12:51  hone  阅读(1913)  评论(0编辑  收藏  举报