這三種類型各有各的優點,比如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 * 就可以了