hur.cn - 华软网

 热门搜索

VS2010中CString与CHAR*之间的转换

  作者:未知    来源:网络    更新时间:2011/8/19
在VS2010中,遇到这么一个问题
C++">
CString strTemp = "Hello World";
CHAR* chartemp = (CHAR*)(LPCTSTR)strTemp;
CHAR* temp = "Hello World";

这样charTemp和temp的长度为什么不一样呢,charTemp的长度只有1,而temp则是"Hello World"的长度。
有没有高手指点下,这么才能正确的从CString转换到CHAR*呢?
---华软 网友回答---
我的理解 
一个是常量 一个是指针
---华软网友回复---
CHAR *temp = "Hello World"相当于CHAR temp[] = "Hello World"
是一个编译时就可确定大小的数组
而CHAR* chartemp = strTemp只是得到了字符串的地址(指针),但为什么长度是1呢,32位系统下不是4吗?
---华软网友回复---
chartemp是指针,它的大小是4,*chartemp的size是1,它代表chartemp指向那个字符。
测量字符串长度要用strlen(),不能用sizeof()。
你这种方法很危险,(CHAR*)(LPCTSTR)这样强制把一个常量指针转换为普通的指针。CString之所以只提供(LPCTSTR)运算符就是因为它不希望你直接修改字符串内容。那样会破坏CString内部的缓冲区大小和共享之类的维护机制。
应该用CHAR* chartemp = strTemp.GetBuffer();
GetBuffer()会暂停CString的自动维护,还可以传一个整数作为参数表示希望保留的缓冲区大小。
用完后要记得ReleaseBuffer()恢复CString的内部机制。

---华软网友回复---
如果你要修改字符串的长度,一定要GetBuffer(512)之类的告诉它预计的长度,否则很容易内存越界
---华软网友回复---
UNICODE工程?
遇到\0了可能
---华软网友回复---
引用 3 楼 bokutake 的回复:
chartemp是指针,它的大小是4,*chartemp的size是1,它代表chartemp指向那个字符。
测量字符串长度要用strlen(),不能用sizeof()。
你这种方法很危险,(CHAR*)(LPCTSTR)这样强制把一个常量指针转换为普通的指针。CString之所以只提供(LPCTSTR)运算符就是因为它不希望你直接修改字符串内容。那样会破坏CString内部的缓冲区大小和共享……

++
一个指针
一个字符串变量
如果想求 *temp占用的字节数
用(strlen(temp)+1)*sizeof(char)
并且确保是在ANSI工程设置的情况下 得到的占用空间应该也不是相等的。。。
因为cstring没有用\0结束,所以chartemp会比*temp少1
---华软网友回复---
CString strTemp = "Hello World";
CStringA strTempA(strTemp);
const CHAR* chartemp = (LPCSTR)strTempA;
---华软网友回复---
CString 有个GetBuffer()方法,用这个就可以转换
---华软网友回复---
引用 3 楼 bokutake 的回复:
chartemp是指针,它的大小是4,*chartemp的size是1,它代表chartemp指向那个字符。
测量字符串长度要用strlen(),不能用sizeof()。
你这种方法很危险,(CHAR*)(LPCTSTR)这样强制把一个常量指针转换为普通的指针。CString之所以只提供(LPCTSTR)运算符就是因为它不希望你直接修改字符串内容。那样会破坏CString内部的缓冲区大小和共享……

我觉得这个讲的不错
---华软网友回复---
嗯学习一下~
---华软网友回复---
C++">// VS2010建立的工程默认是unicode,
CString strTemp = "Hello World";
TCHAR* chartemp = (TCHAR*)(LPCTSTR)strTemp;
char* temp;
// 这里用WideCharToMultiChar 将 wchar_t 转为char,具体用法看MSDN
WideCharToMultiByte(.......);

---华软网友回复---
引用 11 楼 lfchen 的回复:
C/C++ code
// VS2010建立的工程默认是unicode,
CString strTemp = "Hello World";
TCHAR* chartemp = (TCHAR*)(LPCTSTR)strTemp;
char* temp;
// 这里用WideCharToMultiChar 将 wchar_t 转为char,具体用法看MSDN
WideCharToMultiByte……


VS2008 CString的GetBuffer()方法返回TCHAR的指针,TCHAR根据工程是UNICODE还是多元字符集来决定的
UNICODE是wchar_t 多元字符集是char      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。