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