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)
{
 /*因为返回的内存要不停的申请与释放,而且释放很不方便,
 这儿用局部静态变量,但由于长度限制为10240字节,使用时
 要小心,当长度大于10240时要适当做扩展*/
 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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六个沃德

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值