CString转为string遇到的问题

   今天写程序遇到在MFC中获取控件上的字符时,定义了一个CString类型的变量来存放。然后需要将CString类型转为string类型,用于其他函数的使用;出现一个问题,导致我晚上整整花了四十几分钟,想死的心都有了。由于对个中字符类型不是很了解,包括c-style的字符串,c++中模板basic_string等等一系列不是很了解,尤其在涉及到宽字节和多字节时,更是雨里雾里;

   这个问题,其实对于大部分初学者应该都比较头疼。于是上网搜了很多资料,方法也很多,都是我抄你你抄我的,总结了一下两点:

.      1. 用LPCTSTR: char *p = (char *p)(LPCSTR)CString;
       2.用getBuffer():char *p = (char *p)CString.GetBuffer(0);

     这两种办法编译倒是编译过了,但是结果p中只保存了第一个字符。       

     这时候调试的时候会发现p+1是空字符('/0'),p+2才是Cstring重保存的第二个字符。这就是为什么p中只保存了第一个字符的原因。在网上稍微了解了 一下,貌似与宽窄字符有关。

再进一步了解一下就是CString是UNICODE的字串,而string是ANSI的字符。他们之间转换就用到了函数WideCharToMultiByte()。

具体的转换如下:

string CString2string(CString cstr)
{
 DWORD  num = WideCharToMultiByte(CP_ACP,0,cstr,-1,NULL,0,NULL,0);
 char *cword;                
 cword = (char*)calloc(num,sizeof(char));  
 if(cword == NULL)    
 {
  free(cword);
 }
 memset(cword, 0, num*sizeof(char));
 WideCharToMultiByte(CP_ACP,0, cstr, -1, cword, num,NULL,0);
 string ans = cword;
 free(cword);
 return ans;
}

ok了,就这样。这个应该在任何情况下都ok。兄弟们就不必在这上面纠结了。

       

    其实在找到该方法前,我自己用了一个最笨的办法就是把CString里面放的字符一个个取出来赋给一个数组,然后把字符数组转为string。这是最原始的方法,但是很简单,思路也简单,不妨试下:

CString FeatureSel;
int b=FeatureSel.GetLength();
char a[10];
for(int i=0;i<b;i++)
{
a[i]=FeatureSel[i];
}
a[b]='\0';
std::string s(a);


补充:最近又看到一种方法很直接 

CString zsw;

string zsw1=(CStringA)zsw;

就可以实现了,是不是很简单;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值