C 風格字串,C++string類,MFC,CString類的區別。

old_boy_1991發表於2014-07-20

轉自:http://www.cnblogs.com/lidabo/archive/2012/08/27/2658528.html

字串,顧名思義是由字元組成的字串,在標準C,標準C++,MFC中 字串這一功能的實現是不相同的,C++完全相容了C。

1.  標準C中的字串   

在標準C中沒有string這樣的資料型別,C中的字串是有char型別的字元陣列或者char型別的字元指標來實現的。例如:

     char   name[26]="This is a C-style string"; 或者

     char  *name="This is a C-style string"; 

   型別的字串以\0為結束標記,所佔記憶體是實際子符長度+1,其初始化和賦值都要逐個字元的賦值,修改不辨,粒度太小,很不直觀,是程式設計師分散了一些軟體的高階層面問題,如演算法,抽象資料型別或軟體構架。char   *沒有建構函式,僅能由指標賦值,而且是一個極其危險的操作,在宣告char * 的時候如果沒有賦初值,建議先初始化為NULL,以免出現懸浮指標或者指向地址不明的指標,否則,出錯會讓你很爽!

   標準C中是沒有string型別,但是在C中有string.h標頭檔案,需要注意的是此string.h中的string 非彼string,<string.h>標頭檔案中定義了一些我們經常用到的操作字串的函式,如複製函式strcpy,連線字串strcat,比較字串strcmp,這些函式的操作物件都是指向char *的字串。

2.標準C++中的string類

    C++支援C風格字串的使用,而且引入了string類的概念,string為標準模板類STL定義的字串,幾乎可以從所有的字串構造出來。

string字串類的都檔案是<string>,並且要和using namespace std;  一起使用。標頭檔案<string>和標頭檔案<string.h>沒有任何關係,前者是標準C++中的模板庫類,後者是標準C中的包含常用C字串處理函式的標頭檔案,如strcmp,前者並非是後者的升級版。

   要深刻理解標準C++中string是一個類, 如在標準C中定義如下:char * pt=NULL;      這無疑是正確的,但是在標準C++中定義  string  *pt=NULL;這樣做編譯器不會有警告和錯誤,但是執行是就會有異常。這是因為string作為一個類,定義類的物件時要呼叫其建構函式的,上面的例子既沒有呼叫其建構函式,還把指標賦值為NULL,很明顯就會出錯的。正確的 方法是是new操作符,C++中的new不同於C中的malloc, new不但會分配一塊記憶體,還呼叫類的建構函式。string *pt=new("this is a c++-style string"); 或者不用指標 string  str;系統自動呼叫預設的建構函式,構造一個string類的物件。

3. MFC中的CString類。

        MFC中的字串類是CString,封裝了string的東西,並增加了一些介面,在功能上完全相容string類,而一些標準的C/C++不能直接對CString類進行操作,CString 類是微軟的visual c++提供的MFC裡面的一個類,所以只有支援MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用標準C++中的 string類了。另外,因為string類是在c++標準庫中,所以它被封裝在了std名稱空間中,使用之前需要宣告using namespace std;而CString類並不在std名稱空間中,因為它不是c++的標準庫,只是微軟的一個封裝庫。這點看來用string類的程式的移植性更好。CString和string提供的介面方法不同,對char*的轉換也不同。下面的轉換內容來自CSDNBLOG:http://blog.csdn.net/bitxinhai/article/details/2292014

4.1 CString 和string的轉換

  stringstr="ksarea";
CStringcstr(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'的字串*/

4.2.CString和int的轉換inti=123;
CStringstr;
str.format("%d",i);//int->CString 其他的基本型別轉化類似
i=atoi(str);//CString->int 還有(atof,atol)4.3.char*和CString的轉換CStringcstr="ksarea";
char* ptemp=cstr.getbuffer(0);
char* str;
strcpy(str,ptemp);//CString->char*
cstr.releasebuffer(-1);
char*str="lovesha";
CStringcstr=str;//char*->CString string型別不能直接賦值給CString至於int與float、string與char*之間的轉化可以使用強制轉化,或者標準庫函式進行。對於CString與其他型別的轉化方法很多,但其實都殊途同歸,朝著一個方向即將型別首先轉化為char*型別,因為char*是不同型別之間的橋樑。得到char*型別,轉化為其他型別就非常容易了。這篇文章: http://hi.baidu.com/sage_haokun/blog/item/a44b9733aa14d812ebc4afbc.html ,還不錯,主要講述CString和string的區別,感興趣的可以去瞅一下。

相關文章