CString轉為string遇到的問題

2021-06-26 18:07:19 字數 1251 閱讀 1381

今天寫程式遇到在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)

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

補充:最近又看到一種方法很直接 

cstring zsw;

string zsw1=(cstringa)zsw;

就可以實現了,是不是很簡單;

CString日期如何轉為CTime

假設該 cstring 中的結構為 04d年 02d月 02d日 則 cstring timestr 2000年04月05日 int year,month,day byte tt 5 get year memset tt,0,sizeof tt tt 0 timestr 0 tt 1 timestr...

string和CString 的比較

一 概述 string和cstring均是字串模板類,string為標準模板類 stl 定義的字串類,已經納入c 標準之中 cstring typedef cstringt cstring 為visual c 中最常用的字串類,繼承自c stringt類,主要應用在mfc和atl程式設計中,主要資料...

C String與string的區別

c 中同時存在string與string msdn中對string的說明 string is an alias for string in the net framework。string是string的別名而已,string是c 中的類,string是framework的類,c string 對映...