標籤:style blog http color 使用 strong
利用MFC進行編程時,我們從對話方塊中利用GetWindowText得到的字串是 CString類型,CString是屬於MFC的類。而一些標準C/C++庫函數是不能直接對CString類型進行操作的,所以我們經常遇到將 CString類型轉化char*等等其他資料類型的情況。這裡總結備忘於此!
首先要明確,標準C中是不存在string類型的,string是標準C++擴充字串操作的一個類。但是我們知道標準C中有string.h這個標頭檔,這裡要區分清楚,此string非彼string。string.h 這個標頭檔中定義了一些我們經常用到的操作字串的函數,如:strcpy、strcat、strcmp等等,但是這些函數的操作對象都是char*指向 的字串。 而C++的string類操作對象是string類型字串,該類重裝了一些運算子,添加了一些字串操作成員函數,使得操作字串更加方便。有的時候我 們要將string串和char*串配合使用,所以也會涉及到這兩個類型的轉化問題。
1.CString和string的轉化
string str = "ksarea";
CString cstr(str.c_str()); // 或者CString cstr(str.data());初始化時才行
cstr = str.c_str(); // 或者cstr=str.data();
str = cstr.GetBuffer(0); //CString -> string
cstr.format( "%s", str.c_str()); //string->CString
cstr.format( "%s", str.data()); //string->CString
str = LPCSTR(cstr); //CString->string
/*c_str()和data()區別是:前者返回帶‘\0‘的字串,後者則返回不帶‘\0‘的字串*/
2.CString和int的轉換
int i = 123;
CString str;
str.format( "%d",i); //int->CString 其他的基本類型轉化類似
i = atoi(str); //CString->int 還有(atof,atol)
3.char*和CString的轉換
CString cstr = "ksarea";
char* ptemp = cstr.getbuffer(0);
char* str;
strcpy(str,ptemp); //CString->char*
cstr.releasebuffer(-1);
char* str = "lovesha";
CString cstr = str; //char*->CString string類型不能直接賦值給CString
至於int與float、string與char*之間的轉化可以使用強制轉化,或者標準庫函數進行。
對於CString與其他類型的轉化方法很多,但其實都殊途同歸,朝著一個方向即將類型首先轉化為char*類型,因為char*是不同類型之間的橋樑。
得到char*類型,轉化為其他類型就非常容易了。
之所以拋棄char*的字串而選用C++標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字串長度等等,而且作為一個類出現,他整合的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行賦值操作,== 進行比較,+ 做串聯等等。我們盡可以把它看成是C++的基礎資料型別 (Elementary Data Type)。
【參考資料 感謝作者】
http://blog.csdn.net/bitxinhai/archive/2008/04/14/2292014.aspx
【另】
1、string 的標頭檔:<iostream>,<string>,using namespace std;
2、CString 的標頭檔:<afx.h>