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

字符串,顧名思義是由字符組成的字符串,在標準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的轉換

  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'的字符串*/

4.2.CString和int的轉換inti=123;
CString str;
str.format("%d",i);//int->CString 其他的基本類型轉化類似

i=atoi(str);//CString->int 還有(atof,atol)

4.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*類型,轉化爲其他類型就非常容易了。

發佈了14 篇原創文章 · 獲贊 7 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章