CString、char*、string三者的轉換
轉載於:https://www.cnblogs.com/bluestorm/p/3168720.html
這三種類型各有各的優點,比如CString比較靈活,是基於MFC常用的型別,安全性也最高,但可移植性最差。string是使用STL時必不可少的型別,所以是做工程時必須熟練掌握的;char*是從學習C語言開始就已經和我們形影不離的了,有許多API都是以char*作為引數輸入的。所以熟練掌握三者之間的轉換十分必要。
以下我用簡單的圖示指出三者之間的關係,並以標號對應轉換的方法。
1 string to CString
CString.format("%s",string.c_str());
2 CString to string
string str(CString.GetBuffer(str.GetLength()));
3 string to char *
char *p=string.c_str();
4 char * to string
string str(char*);
5 CString to char *
strcpy(char,CString,sizeof(char));
6 char * to CString
CString.format("%s",char*);
CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *轉換時,要把char定義成為const char*,這樣是最安全的。
以上函式UNICODE編碼也沒問題:unicode下照用,加個_T()巨集就行了,像這樣子_T("%s")
補充:
CString 可能是 CStringW/CStringA,在與 string 轉換時,如果是 CStringW,還涉及編碼轉換問題。下面以 CStringA 來說明。
1 string to CString
CString.format("%s",string.c_str());
CStringA = string.c_str() 就可以了
2 CString to string
string str(CString.GetBuffer(str.GetLength()));
GetBuffer 有引數的話,可能導致內部的分配空間動作,要進行後續 ReleaseBuffer 操作。
string = CStringA
string = CStringA.GetBuffer();
3 string to char *
char *p=string.c_str();
4 char * to string
string str(char*);
5 CString to char *
strcpy(char *,CString,sizeof(char));
按照 3 風格,這裡應該 char * = CStringA; 或者 char *p = CStringA.GetBuffer();
6 char * to CString
CStringA = char * 就可以了