VS2010 将CString转换成char* 或const char*

VS2010 将CString转换成char* 或const char*网上介绍了各种方法,令你眼花缭乱,
但很多方法其实在vs2010下是不凑效的,他们说的大部分方法都是在VC6.0下的转换。而在VS2010的Unicode默认编程环境下,
经过试了N回之后还是不成功之后,会令你心烦意乱。下面是网上列举的一些转换的方法:CString转char*,如:
char * a = (LPSTR)(LPCTSTR)name; //name类型为CString
char * a =s name.GetBuffer(name.GetLength());
第一种方法 在VS2010下他们不会报错,你会发现你可能得不到预期的结果,具体原因不说,自己搜了,网上很多。
第二种方法 会报错如: error C2440: “=”: 无法从“wchar_t *”转换为“char *”;所以还是失败了。
网上也没有好的简洁的方法,只有自己写函数了,一个通用的比较好的函数,是既能将Cstring转成char * 又能将其转换为const char *,
只需稍微修改即可

函数1:CString转换为char*

  1. char* CStrToChar(CString strSrc)  
  2. {  
  3. #ifdef UNICODE  
  4.         DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, NULL, 0, NULL, FALSE);  
  5.     char *psText;  
  6.     psText = new char[dwNum];  
  7.     if (!psText)  
  8.         delete []psText;  
  9.     WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, psText, dwNum, NULL, FALSE);  
  10.     return psText;  
  11. #else  
  12.     return (LPCTSRT)strSrc;  
  13. #endif  
  14. }  

转换成const char * 的

[cpp]  view plain copy
  1. const char* CStrToChar1(CString strSrc)  
  2. {  
  3. #ifdef UNICODE  
  4.     DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, NULL, 0, NULL, FALSE);  
  5.     char *psText;  
  6.     psText = new char[dwNum];  
  7.     if (!psText)  
  8.         delete []psText;  
  9.     WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, psText, dwNum, NULL, FALSE);  
  10.     return (const char*)psText;  
  11. #else  
  12.     return (LPCTSRT)strSrc;  
  13. #endif  
  14. }  
都是比较通用的,在强制转换不凑效的情况下,利用它们来转换还是很很有效的!!只是存在一些缺点。
存在缺点:因为返回的的是动态分配的数组,所以会有内存泄露的危险,
还需进一步改进!!!
可以直接作为函数参数将CString变量进行直接转换,但这样就不能在使用完之后对其占用的内存空间进行有效的释放,
可以这样使用:
[cpp]  view plain copy
  1. int main()  
  2. {  
  3.     CString str = _T("WINDOWS7");  
  4.     char* pChar1 = CStrToChar(str);  
  5.     //pChar = str.GetBuffer(str.GetLength());  // 不能这样转  
  6.     //char* pChar3 = (LPCSTR)(LPCTSTR)str;     // 取值时出现问题  
  7.     cout << "pChar1 = " << pChar1 << endl;  
  8.   
  9.     delete[] pChar1;  // 释放由CStrTuChar函数占用的内存  
  10.     return 0;  
  11. }  

但不能这样用:

[cpp]  view plain copy
  1. CString GetLine(char* lpData, int &ndx);  
  2. int main()  
  3. {  
  4.     CString str = _T("WINDOWS7");  
  5.     GetLine(CStrToChar(str), 7); // 这样做,由CStrCStrToChar分配的内存就无法释放了,所以内存泄漏了  
  6.       
  7.     .........  
  8.     return 0;  
  9. }  
正确的用法就是先将转换后的值赋给一个char *变量,在函数用完之后,释放由char* 变量指向的内存。
函数2:CString转换为char
[cpp]  view plain copy
  1. int CStrToChar(char* pDest, CString&  pSource)  
  2. {  
  3.     size_t i;  
  4.     wchar_t* pawstr = NULL;  
  5.     pawstr =   pSource.GetBuffer(pSource.GetLength()+1);  // 先转换为宽字节  
  6.     //wcstombs(pDest, pawstr, pSource.GetLength()+1);     // 非安全版  
  7.     wcstombs_s(&i, pDest, pSource.GetLength()+1, pSource, pSource.GetLength()+1);  // 安全版  
  8.     return 0;  
  9. }  

下面是用法:

[cpp]  view plain copy
  1. #define BUFFER_SIZE 100  
  2. int main()  
  3. {  
  4.     CString str = _T("WINDOWS7");  
  5.     char ch[BUFFER_SIZE];  
  6.         char* pChar = ch;  
  7.     CStrToChar(pChar, str);  
  8.     cout <<"pChar =   "<< pChar << endl;  
  9.   
  10.     return 0;  
  11. }  

其实函数2更像是将CString变量转换为char变量,然后由char*变量指向char变量,所以,
缺点:指定字符数组大小BUFFER_SIZE,但其不用考虑内存泄露的问题,所以,
在CString变量不是很大的情况下,可以考虑。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随笔 - 764 文章 - 3 评论 - 196 CString,string,char*之间的换() 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。所以熟练掌握三者之间的换十分必要。 以下我用简单的图示指出三者之间的关系,并以标号对应换的方法。 1 string to CString CString.format("%s",string.c_str()); 2 CString to string string str(CString.GetBuffer(str.GetLength())); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char,CString,sizeof(char)); 6 char * to CString CString.format("%s",char*); CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *换时,要把char定义成为const char*,这样是最安全的。 以上函数UNICODE编码也没问题:unicode下照用,加个_T()宏就行了,像这样子_T("%s") 补充: CString 可能是 CStringW/CStringA,在与 string 换时,如果是 CStringW,还涉及编码换问题。下面以 CStringA 来说明。 1 string to CString CString.format("%s",string.c_str()); CStringA = string.c_str() 就可以了 2 CString to string string str(CString.GetBuffer(str.GetLength())); GetBuffer 有参数的话,可能导致内部的分配空间动作,要进行后续 ReleaseBuffer 操作。 string = CStringA string = CStringA.GetBuffer(); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char *,CString,sizeof(char)); 按照 3 风格,这里应该 char * = CStringA; 或者 char *p = CStringA.GetBuffer(); 6 char * to CString CStringA = char * 就可以了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值