CString与char[] 的相互转换以及结尾乱码问题的分析解决

一、CString 转化成char[]

方法一:运用 CString.GetBuffer(0) 与 strcpy

[cpp] 
CString str;  
int len = str.GetLength();  
char* arr = new char[len];  
strcpy(arr,str.GetBuffer(0));

方法二:
char *转为CString可以直接赋值,比如
MFC的CString转为char *
CString str = “abc”
char *psz = (LPTSTR)(LPCTSTR)str;
str = psz;

二、char[]转化成CString

char ch[7] = {'w','u','d','i','z','h','u'};  
CString szTest(ch);  
AfxMessageBox(szTest);  

char ch[7] = {'w','u','d','i','z','h','u'};  
CString szTest;  
szTest.Format("%s",ch);  
AfxMessageBox(szTest);  

可是运行结果都是结尾有乱码。
在CString的最后多出了乱码,而测试得到的CString对象的长度为7,这是为什么呢?

CString 对象将ch 当做字符串来处理的,所以在把一个char[]转化成CString对象时,会分两个过程:首先会把char[]转化成char*,这个转化就会在字符串的结尾产生乱码,测试如下:

[cpp] view plaincopy
char ch[2] = {'a','b'};  
TRACE("%s",ch); 

调试运行得到:ab烫t

接着把char*字符串存储在CString对象的CStringData 对象中,这是保存的已经是存在乱码的数据了,所以在输出时就出现了我们看到的乱码,到这里或许大家都知道了乱码的原因了吧。

下面就着手解决,只要将数组的最后一位赋值为’/0’即可。

[cpp] 
char ch[3] = {'a','b','\0'};  
CString str;  
str.Format("%s",ch);  
AfxMessageBox(str);  

或者

 int size=strlen(char);
 char[size-1] = '\0'

猜你喜欢

转载自blog.csdn.net/m0_37251750/article/details/86604921