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

一、CString 转化成char[]

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

 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'

三、TCHAR转std::string

std::string TCHAR2STRING(TCHAR* sValue)
	{
		int iLen = WideCharToMultiByte(CP_ACP, 0, sValue, -1, NULL, 0, NULL, NULL);

		char* chRv = new char[iLen * sizeof(char)];

		WideCharToMultiByte(CP_ACP, 0, sValue, -1, chRv , iLen, NULL, NULL);

		std::string strValue(chRv );

		return strValue;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧特克_Glodon

很高兴能帮助到您!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值