CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CString的三种形式
Visual C++.NET中将CStringT作为ATL和MFC的共享的“一般”字符串类,它有CString、CStringA和CStringW三种形式,分别操作不同字符类型的字符串。这些字符类型是TCHAR、char和wchar_t。TCHAR在Unicode平台中等同于WCHAR(16位Unicode字符),在ANSI中等价于char。wchar_t通常定义为unsigned short。由于CString在MFC应用程序中经常用到,这里不再重复。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
利用CStringA类型和CStringW两个类型之间可以自动进行转换这一特性,我们可以完成很多类型之间的相互转换,下面举例说明。
在Unicode环境下完成CString向string类型的转换, 可以这么做!
CString src = _T(“你好”); //在Unicode环境下面src是CStringW类型 CStringA temp = src.GetBuffer(0); //通过转化,temp接受了原来字符串的多字节形式 string dst = temp.GetBuffer(0); //现在就可以将值直接赋给string类型了
关于CString::GetBuffer()函数:
函数原型:
LPTSTR GetBuffer( int nMinBufLength )throw( CMemoryException );
Return Value返回值
An LPTSTR pointer to the object’s (null-terminated) character buffer.
一个LPSTR类型的指针,这个指针指向一个以空终止字符串结尾的字符缓冲区。
Parameters 参数
nMinBufLength
The minimum size of the character buffer in characters. This value does not include space for a null terminator.
字符缓冲区的最小大小,这个数值不包括空终止字符型.
Remarks 注意
Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents.
返回一个指向CString实体的内部的字符缓冲区的指针。返回的 LPTSTR 是非常量的,这意味着你可以直接修改里面的值。
If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
如果你使用GetBuffer函数返回的指针改变了字符的内容,那么,在使用任何CString别的成员函数的时候,你必须先调用ReleaseBuffer函数。
几点要注意一下:
1.对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-[const] char*)是错误的。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。
GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。
CString ::GetBuffer有两个重载版本:
LPTSTR GetBuffer( );
LPTSTR GetBuffer(int nMinBufferLength);
在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。而调用第一个版本时,应如通过传入0来调用第二个版本一样。
2.是否需要在GetBufer后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。如果你GetBuffer以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer没什么意义了。
3.不给 GetBuffer 传递参数时它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。假设你想增加字符串的长度,就必须将你需要的字符空间大小(注意:是字符而不是字节,因为 CString 是以隐含方式感知 Unicode 的)传给它。当调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。
LPTSTR p = s.GetBuffer(); // do something with pint m = s.GetLength(); // 可能出错!!! s.ReleaseBuffer(); int n = s.GetLength(); // 保证正确
Unicode环境下完成CString向string类型的转换