0
点赞
收藏
分享

微信扫一扫

CString与char*互转

编程练习生J 2022-03-19 阅读 64
c++

CString strSource;//宣告CString
char* charSource; //宣告char*

法1:
charSource = (char*)strSource.GetBuffer(0);

法2:
charSource = (char*)strSource.GetBuffer(strSource.GetLength());

法3:
charSource = (char*)(LPCTSTR)strSource;

1、Unicode下CString转换为char *

方法一:使用API:WideCharToMultiByte进行转换

              CString str = _T("D://校内项目//QQ.bmp");

            //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
              int n = str.GetLength();     // n = 14, len = 18

             //获取宽字节字符的大小,大小是按字节计算的
             int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

             //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
            char * pFileName = new char[len+1];   //以字节为单位

            //宽字节编码转换成多字节编码
            WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

             pFileName[len+1] = '/0';   //多字节字符以'/0'结束

方法二:使用函数:T2A、W2A

             CString str = _T("D://校内项目//QQ.bmp");

              //声明标识符
             USES_CONVERSION;

             //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
             char * pFileName = T2A(str);   
             //char * pFileName = W2A(str); //也可实现转换

            注意:有时候可能还需要添加引用#include   <afxpriv.h>

2、Unicode下char *转换为CString

方法一:使用API:MultiByteToWideChar进行转换

               char * pFileName = "D://校内项目//QQ.bmp";

              //计算char *数组大小,以字节为单位,一个汉字占两个字节
             int charLen = strlen(pFileName);

             //计算多字节字符的大小,按字符计算。
             int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);

              //为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
             TCHAR *buf = new TCHAR[len + 1];

               //多字节编码转换成宽字节编码
              MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);

             buf[len] = '/0'; //添加字符串结尾,注意不是len+1

              //将TCHAR数组转换为CString
              CString pWideChar;
              pWideChar.Append(buf);

              //删除缓冲区
             delete []buf;

方法二:使用函数:A2T、A2W

               char * pFileName = "D://校内项目//QQ.bmp";

              USES_CONVERSION;
              CString s = A2T(pFileName);

             //CString s = A2W(pFileName);

方法三:使用_T宏,将字符串转换为宽字符

            //多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集
            //AfxMessageBox("加载数据失败",0);

             //书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
            AfxMessageBox(_T("加载数据失败"),0);  

       注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符。

一、使用多字节字符集

1.CString转char*

(1)传给未分配内存的const char* (LPCTSTR)指针. 

CString cstr="ABC";
const char* ch = (LPCTSTR)cstr;
//ch指向的地址和cstr相同。但由于使用const保证ch不会修改,所以安全.

(2)传给未分配内存的指针.


CString cstr = "ABC";
char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);
cstr.ReleaseBuffer();
//修改ch指向的值等于修改cstr里面的值.
//PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.


(3)把CString 值赋给已分配内存的char *。

CString cstr = "ABC";
int strLength = cstr.GetLength() + 1;
char *pValue = new char[strLength];
strncpy(pValue, cstr, strLength);


(4)把CString 值赋给已分配内存char[]数组.

CString cstr= "ABC";
strncpy(chArray, cstr, strLength1);
int strLength1 = cstr1.GetLength() + 1;
char chArray[100];
memset(chArray,0, sizeof(bool) * 100); //将数组的垃圾内容清空.


2.char*转CString


(1)char *p = "abc";
CString str(p);
 
(2)CString str;
char * p="abc";
str.Format("%s",p);
 
(3)CString str;
char * p="abc";
p=str;

举报

相关推荐

0 条评论