String、Cstring、char*之間的關係與轉換一直都是似懂非懂的,而且在MFC程式匯中也不知道什麼時候有哪一個,一頭霧水。。於是把網上的東西,結合之間的理解整理了一下。
一、概述
先說char*(這個是基礎),因為其應該是最簡單和最基礎的,其從作用上講就相當於一般的int*或者double*,這種基礎的結構。但是由於字串的特殊性,我們有單獨用了其他類來處理。在c++中用了String類,而在MFC中用了Cstring類。所以,從根本上說,char*是最基本的,而string和cstring只是對char*的一個拓展而已。
二、比較
那麼著三種的相互關係是什麼呢?因為string和cstring都是對char*的拓展,我們可以知道他們都應該是對char*繼續相容的,這種相容可以通過建構函式和operator=來進行。同時,如果進階的string和cstring要向低級的char*轉換,就需要藉助函數了。我們可以通過函數format進行。下面具體的給予說明:
1:同級之間的string和cstring
a:string到cstring
cstring.format("%s",string.c_str());
b:cstring到string
string s(cstring.getbuffer());
或者
cstring cstr; string s=sctr;
分析:a中是先把string通過函數c_str轉換到char類型,在通過char類型轉換成ctring。
b中的getbuffer是cstring的內建函式,其返回記憶體字元緩衝區的指標,這裡也是相當於通過char進行轉換的。
c中是通過賦值操作符進行轉換。
2:低級的向進階的轉換(char*到string或者cstring)
a:string到char*
前面已經提到string的c_str函數就是實現這個轉換,即可以用string.c_str().
b:cstring到char*
前面也提到函數getbuffer可以實現這個轉換,用ctring.getbuffer()即可,也可以通過LPCTSTR進行強制轉換。
三、總結
這裡可以看到這裡面的中間過程還是基礎的char*,記住string和cstring的兩個函數string.c_str()和cstring.getbuffer()可以得到char*即可或者LPCTSTR強制轉換。
四、附加的char,wchar_t,TCHAR的區別
這裡涉及到兩種編碼方式ANSI和Unicode,一個是美國用的(American),一個是通用的(Universal)。因此,char對應的是ANSI,wchar_t對應的是Unicode,TCHAR是兩種都相容的。對於三者通常對應的字串處理函數的標頭檔分別為str***,wcs***,_tcs***.
以strcpy函數為例子,總結一下:
如果你想使用ANSI字串,那麼請使用這一套寫法:
char szString[100]; strcpy(szString,"test");
.如果你想使用Unicode字串,那麼請使用這一套:
wchar_t szString[100]; wcscpyszString,L"test"); .
如果你想通過定義_UNICODE宏,而編譯ANSI或者Unicode字串代碼:
TCHAR szString[100]; _tcscpy(szString,_TEXT("test"));
註:(MFC中大部分都是要求通用的即wchar_t,而c++一般定義的ANSI。)
他們之間的轉換可以通過函數wcstombs(char* strDes, const wchar*, size_t nMax);這個函數的作用是把wchar轉換為char。char*
strDes 為儲存轉換後的一般字元串,wchar* 要被轉換的寬字元串。轉換的最大長度。這裡的長度是轉換的個數,而不是位元組長度。mbstowcs() 就是一個相反的過程了。
參考:http://blog.csdn.net/yanonsoftware/article/details/544428