用C样式字符串相关的CString操作

CString 对象包含字符字符串数据。 CString 继承在选件类模板 CStringT 定义的字符串处理数据的设置 方法和运算符。 (CString 是一种特殊 CStringT 与字符数据一起使用 CString 支持。)的 typedef

CString 内部不存储字符数据,因为c.样式Null终止的字符串。 相反,CString 跟踪字符数据的长度,以便所需它可以安全地注意数据和空格。

CString 接受C样式字符串,并提供用于访问字符数据.作为c样式字符串。 本主题包含演示如何使用 CString 对象的以下部分,就象它是c.样式Null终止的字符串。

  • 转换为C样式Null终止的字符串

  • 与标准运行库字符串函数一起使用

  • 修改的CString内容直接

  • 使用变量参数函数的CString对象

  • 指定CString形参

使用CString为c.样式Null终止的字符串

若要使用 CString 对象作为c.样式字符串,请将转换为 LPCTSTR的对象。 在下面的示例中,CString 返回指向只读C样式Null终止的字符串。 strcpy 功能变量中 myString使该C样式字符串的副本。

    CString aCString = "A string";
    char myString[256];
    strcpy(myString, (LPCTSTR)aString);

可以使用 CString 方法,例如,SetAt,修改字符串中对象的各个字符。 但是,在中,当所有更改 CString时,LPCTSTR 指针是瞬态的并变为无效。 CString 也可能超出范围并会自动被删除。 建议您获取您使用的 CString 对象的一新鲜的 LPCTSTR 指针每次。

有时可能需要 CString 数据的副本直接修改。 使用该捕获功能 strcpy_s (或Unicode/MBCS可移植 _tcscpy_s)复制 CString 对象到单独的缓冲区。 这是可以安全地修改的位置字符,如显示按以下示例。

CString theString(_T("This is a test"));
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
//... modify lpsz as much as you want   

备注

为 strcpy_s (或Unicode/MBCS可移植 _tcscpy_s)的第三个参数是 constwchar_t* (unicode)或 constchar* (ansi)。上面的示例通过此参数的 CString。C++编译器自动将对转换 CString 为 LPCTSTR的 CString 选件类定义的转换函数。能够定义从一种类型的强制转换操作到另一个是一个C++最有用的功能。

与标准运行库字符串函数一起使用

应该能找到 CString 方法执行则可以考虑使用标准C运行库字符串等功能 strcmp 的所有字符串操作(或Unicode/MBCS可移植 _tcscmp)。

如果必须使用C运行时字符串功能,可以在 转换为C样式Null终止的字符串描述的技术_core_using_cstring_as_a_c.2d.style_null.2d.terminated_string。 可以复制为等效的C样式字符串缓冲区的 CString 对象,执行您的缓冲区的操作,然后将得到的C样式字符串返回 CString 对象。

修改的CString内容直接

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

具有,如的某些情况,则有意义直接修改 CString 目录,将需要字符缓冲区的操作系统的功能时。

GetBufferReleaseBuffer 方法提供对 CString 对象的内部字符缓冲区的访问并让您直接修改它。 下面的步骤演示如何因此使用这些功能。

使用GetBuffer和ReleaseBuffer访问CString对象的内部字符缓冲区

  1. 调用 CString 对象的 GetBuffer 并指定需要缓冲区的长度。

  2. 使用 GetBuffer 返回的指针写入字符直接添加到 CString 对象。

  3. 调用 CString 对象的 ReleaseBuffer 可以更新所有内部 CString 状态信息,例如,字符串的长度。 在直接修改后 CString 对象的内容,必须调用 ReleaseBuffer,在调用任何其他 CString 成员函数之前。

使用变量参数函数的CString Objects

某些C函数接受参数数目可变。 一种值得注意的是 printf_s。 由于这种这种函数声明,编译器不确定的参数的类型,并且无法确定执行哪个转换操作在每个参数。 所以,如果您使用转换的显式类型,当传递给参数数目可变的函数时的一 CString 对象。

如下面的示例所示,若要使用 CString 对象在一个变量参数函数,请显式强制转换 CStringLPCTSTR 字符串。

CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);    

指定CString形参

对于需要字符串参数的大部分功能,指定形参在函数原型作为 const 指向字符(LPCTSTR)是最佳而不是 CString。 当形参指定为字符时的 const 指针,可以通过任何指向 TCHAR 数组、一个文本字符串 ["hi there"] 或 CString 对象。 CString 对象将自动转换为 LPCTSTR。 可以使用 LPCTSTR的所有位置,还可以使用 CString 对象。

还可以指定形参,当常数字符串引用(即 constCString&),则不会修改参数。 如果该字符串将函数,修改放下 const 修饰符。 如果默认空值需要,请将其初始化为空字符串 [""],如下所示:

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

对于大多数函数结果,可以通过值返回 CString 对象。

请参见

概念

CString传递

其他资源

字符串(ATL/MFC)