天天看点

vs2010 CString转换char *

百度了半天,大家的介绍很多,但是发现不全面,一直解决不了问题,综合下自己的情况分享下自己的解决办法。

首先网上最常见的转换是这样的:

CString  str("Test");

char *p=(LPSTR)(LPCTSTR)str;

或者

char *p=(char *)(LPCTSTR)str;

以上的方法不会报错,但是忽略了一个问题,那就是你的编译环境是怎样的,如果你是UNICODE,那么存储字符串时是两个字节两个字节的,这样强制转换会出现乱码的,特别是数字字符串的时候,直接就被截断了,例如:“12345”, 通过上面的转换后存入p里面的值只有“1“,因为内存里面两字节的1后两位是0,就相当于字符串结束了。

以下是自己的解决办法,希望对大家有用:

CString str;

#ifdef UNICODE

 wchar_t *lp = (LPTSTR)(LPCTSTR)str;  //如果是unicode编码 要先转换为两字节类型的字符串

 char cp[256];   //这儿简单操作就不动态分配了

    int len= WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),NULL,0,NULL,NULL);   //宽字节变为单字节

    WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),cp,len,NULL,NULL); 

    cp[len]='\0'; 

#else

 char *sp = (LPSTR)(LPCTSTR)str; //如果是单字节的可以直接这么使用

#endif

以下对转换的过程做一下封装免得每次都要写一大段代码:

//CString转换为char * 注意CString已确定为unicode编码

char * CString2Char(CString str)

{

 wchar_t *temp = (LPTSTR)(LPCTSTR)str;//获得的是CString的地址,不能修改指向的值

 return WChar2Char(temp);

}

//线程不安全 不能多线程调用

char * WChar2Char(wchar_t *str)

{

 static char p[10240];//10k

 memset(p, 0, sizeof(char)*10240);//p会保留上次的结果,这儿最好初始化一下

 int len= WideCharToMultiByte(CP_ACP,0,str,wcslen(str),NULL,0,NULL,NULL);  

    if (len >= 10240)

  return NULL;

 WideCharToMultiByte(CP_ACP,0,str,wcslen(str),p,len,NULL,NULL); 

    p[len]='\0'; 

 return p;

}

这样上面的代码就可以简化了,以后调用也方便多了

CString str;

char *p;

#ifdef UNICODE

   p = CString2Char(str);

#else

   p = (LPSTR)(LPCTSTR)str;

#endif