CString转为string遇到的问题

来源:互联网 发布:金士顿u盘数据恢复 编辑:程序博客网 时间:2024/06/15 20:24

   今天写程序遇到在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;

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



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完孩子后脱发怎么办 学生掉头发很厉害怎么办 35岁开始掉头发怎么办 高三学生玩手机怎么办 高三学生不学习怎么办 17岁经常掉头发怎么办 出汗后头皮很痒怎么办 头发老是掉怎么办会不会长出来 头发痒还掉头发怎么办 7个月宝宝入睡难怎么办 45天宝宝入睡难怎么办 两岁宝宝入睡难怎么办 吃激素掉发严重怎么办 20多岁掉头发怎么办 最近头发老掉怎么办20 20多岁最近严重脱发怎么办 头痒头皮屑多掉头发怎么办 有头屑头痒掉头发怎么办 老是头痒掉头发怎么办 头屑头痒掉头发怎么办 头痒头屑多掉头发怎么办 洗头发时总是掉发怎么办 染头发染到脸上洗不掉怎么办 总爱掉头发怎么办20岁 头发开叉长的慢怎么办 洗头时掉很多头发怎么办 出门前头发很油怎么办 关于头发头顶头发少怎么办 每天掉100根头发怎么办 小孩嘴巴烂了该怎么办 小孩吃烧烤嘴巴肿好大该怎么办 脸特别瘦的人怎么办 怀孕宝宝太懒了怎么办 奶油胶手机壳脏了怎么办 为什么电脑桌面壁纸变成黑色怎么办 仓鼠妈妈老忘了宝宝怎么办 木工三排多轴钻床气缸坏了怎么办? 水溶笔洗不掉怎么办 针管笔没有墨了怎么办 二岁小儿不爱吃饭怎么办 狗狗一直挠痒痒怎么办