字串,顧名思義是由字元組成的字串,在標準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的區別,感興趣的可以去瞅一下。