CString是MFC對字符串的封裝, 它包含一個可變長的字符序列, 提供了很多串操作, 使用它比使用其他的字符串類型更加方便. CString沒有繼承任何類.CString中的各個字符都是TCHAR類型的, 它在UNICODE中是16位, 在普通字符集中是8位. CString對象可以隨著串合并操作而動態(tài)增長其長度,而無須用戶來對其長度進(jìn)行專門設(shè)置. 你最好把CString看作一個串類型,而不是一個指向字符串的指針; 但CString可以轉(zhuǎn)換為const char*和LPCTSTR類型, 也就是說, 以const char*和LPCTSTR為參數(shù),也可以以CString作為參數(shù)進(jìn)行調(diào)用. 一、CString的構(gòu)造函數(shù) CString類擁有眾多的構(gòu)造函數(shù), 用于以不同的數(shù)據(jù)類型和不同的方式構(gòu)造一個字符串對象: CString(); //無參數(shù)的構(gòu)造函數(shù),產(chǎn)生一個空的CString對象 CString(const CString& stringSrc); //用另一個CString對象的值初始化對象 CString(TCHAR ch, int nRepeat=1);//用一個字符重復(fù)若干次來初始化對象 CString(LPCTSTR lpch, int nLength);//用一個字符數(shù)組和一定長度來初始化對象 CString(const unsigned char* psz);//從一個無符號字符指針構(gòu)造對象 CString(LPCWSTR lpsz);//從一個Unicode字符串來構(gòu)造對象 CString(LPCSTR lpsz);//從一個ANSI字符串構(gòu)造對象 可以把某些構(gòu)造函數(shù)看作于類型轉(zhuǎn)化。下面是一些例子: CString s1; CString s2("big"); CString s3 = s2; CString s4(S2 + " " + s3); CString s5(" x"); //s5=" x"; CString s6(" x",7); //s6=" xxxxxxx"; CString s7((LPCSTR)ID_FILE_NEW); //ID_FILE_NEW是一個資源ID CString city="Beijing";//注意不是同值運算符 二、CString的基本操作 得到字符串長度:即字符串包含的字符數(shù),用函數(shù)GetLength,它返回一個int類型的數(shù)。 BOOL IsEmpty() const; //判斷字符串是否為空 void Empty();//強(qiáng)制字符串長度為0; TCHAR GetAt(int nIndex) const //得到字符串某位置的字符;(或者用重載后的操作符“[]”) void SetAt(int nIndex, TCHAR ch)//設(shè)置字符串某位置的字符; operator LPCTSTR;強(qiáng)制轉(zhuǎn)換為字符串指針類型 比如下面的代碼得到字符串最后一個字符: CString str=" aabbcde"; char c1 = str.GetAt(str.GetLength()-1); //c1="e" char c2 = str[str.GetLength()-1]; //c2="e" 三、字符串賦值、合并與格式化 1. 操作符“=”, “+”, “+=”可用于字符串的賦值與合并,如: CString str1 = "ssm", str2("dy"), str3; str3 = str1; //str3 = "ssm"; str3 = str1 + str2; //str3 = "ssmdy"; str3 += str1; //str3="ssmdyssm"; 2. 最常用的字符串格式化函數(shù)是CString::Format,它根據(jù)一個參數(shù)字符串(格式控制字符串)和幾個變量來格式化一個串。 它的聲明為: void Format(LPCTSTR lpszFormat,...); void Format(UINT nFormatID, ...); 其中l(wèi)pszFormat是格式控制字符串,nFormatID是格式控制字符串的資源ID。 函數(shù)Format常常用于把其他類型的變量轉(zhuǎn)換為為字符串形式,或者把幾個不同類型的值合并成一個字符串的形式。下面代碼演示如何把字符(char)、整數(shù)(int)、浮點數(shù)(float)及其他字符串格式化到一個CString對象。 CString str1, str2, str3; str1.Format("%c%c", 13, 10); str2.Format("float:%f, int:%d, hexint:%x", 3.48, 20, 0xFF); str3.Format("string:%s, formated float:%2.1f", "hehe", 3.14159; 函數(shù)Format的參數(shù)中不能包含對象本身,比如語句: str.Format("%s%d", str, 20); 出現(xiàn)在程序中將導(dǎo)致無法預(yù)計的后果!改成這樣就沒問題了: str1 = str; str.Format("%s%d", str1, 20); 此外,還有一個函數(shù)FormatMessage, 它格式化一個消息字符串,這個函數(shù)的參數(shù)與Format類似. 3. 函數(shù)LoadString用于從一個字符串資源ID得到取得字符串值。函數(shù)格式為: BOOL LoadString(UINT nID); 四、字符串的比較 CString類重載了諸如:“==”、“!=”、“>=”、“>”、“<=”、“<”等比較操作符,并且CString對象和LPCTSTR可以相互比較,如: CString s1("abc"); CString s2("abd"); ASSERT(s1<s2); ASSERT("ABC"<s1); ASSERT是一個宏,當(dāng)它的參數(shù)為false時會彈出一個消息框提示用戶,用戶可以選擇繼續(xù)運行程序或忽略或退出程序的運行。 CString::Compare對本對象和參數(shù)字符串進(jìn)行比較,返回的值大于、等于、小于0分別表示本對象比參數(shù)字符串大、相等、小。 函數(shù)CompareNoCase與Compare類似,區(qū)別是它不考慮字符的大小寫。 五、串提取 串提取函數(shù)根據(jù)某種原則從串中提取一個子串,相關(guān)函數(shù)包括:Mid、Left、 Right、SpanIncluding、SpanExcluding。 函數(shù)Mid、Left、Right分別根據(jù)參數(shù)取得字符串中間、左邊、右邊的子串。它們的聲明如下: CString Mid(int nFirst) const; //獲取從nFirst位置字符開始的子串 CString Mid(int nFirst, int nCount) const; //獲取從nFirst位置的字符開始包含nCount個字符的子串(即到nFirst+nCount-1位置的字符為止) CString Left(int nCount) const; //獲取左邊nCount個字符所構(gòu)成的子串 CString Right(int nCount) const; //獲取右邊nCount個字符所構(gòu)成的子串 函數(shù)SpanIncluding功能是從字符串提取一段這樣子串:它從本字符串第一個字符開始,直到遇到不屬于特定集合的字符為止(不包含這個字 符)。這個字符集合由參數(shù)字符串給出。如果字符串所有字符都屬于指定字符集合,函數(shù)返回整個子串;如果字符串第一個字符不屬于指定集合,函數(shù)返回空串。 SpanIncluding的聲明為: CString SpanIncluding(LPCTSTR lpszCharSet) const; 函數(shù)SpanExcluding的功能是從字符串提取這樣一段子串:它從本字符串第一個字符開始,直到遇到屬于特定集合的字符為止(不包含這個字 符)。這個字符集合由參數(shù)字符串給出。如果字符串所有字符都不屬于指定字符集合,函數(shù)返回整個子串;如果字符串第一個字符屬于指定集合,函數(shù)返回空串。 SpanExcluding的聲明為: CString SpanExcluding(LPCTSTR lpszCharSet) const; 如果說Mid、Left、Right三個函數(shù)是根據(jù)位置來提取子串的話,那么SpanIncluding和SpanExcluding兩個函數(shù)是根據(jù)字符特征來提取子串。 六、串轉(zhuǎn)換 串轉(zhuǎn)換包括對串中字符的增加、刪除、大小寫變換、子串替換、開頭結(jié)尾空白字符清除等,相關(guān)函數(shù)有:MakeUpper、 MakeLower、 MakerReverse、 Replace、 Remove、 Insert、 Delete、 TrimLeft、 TrimRight。 (1)把串中所有字母變成大寫字母:MakeUpper;相反,MakeLower把串中所有字母變成小寫字母。 (2)顛倒串中所有字符的順序:MakeReverse, 比如"abc”變成"cba“。 (3)子串替換:Replace,這個函數(shù)有兩種形式,分別用于字符替換和串替換 int Replace (TCHAR chOld, TCHAR chNew); int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew); 函數(shù)返回被替換掉的字符數(shù)。 (4)從本串中去掉所有的指定字符:int CString::Remove(TCHAR ch), 這個函數(shù)是區(qū)分大小寫的。 (5)在本串指定位置插入一個字符或字符串:Insert, 這個函數(shù)有兩種形式: int Insert(int nIndex, TCHAR ch) int Insert(int nIndex, LPCTSTR pstr) (6)在本串指定位置刪除一個字符或子串:Delete。 (7)函數(shù)TrimLeft和TrimRight分別用來清除串開頭和串結(jié)尾的空白字符??瞻鬃址ǎ嚎崭?、Tab、換行符;也可以自己通過函數(shù)參數(shù)指定要清除哪些字符。TrimLeft的三種不同的形式: void TrimLeft(); void CString::TrimLeft(TCHAR chTarget); void CString::TrimLeft(LPCTSTR lpszTargets); 其中參數(shù)lpszTargets中包含了要清除的所有字符。 七、串查找 與串查找相關(guān)的函數(shù)有:Find、ReverseFind、FindOneOf。 完成串查找的基本函數(shù)是Find,它從一個串中查找一個字符或指定子串(返回第一個匹配字符或匹配串首字母的位置),并且可以指定查找的起始位置。Find的函數(shù)聲明是: int Find(TCHAR ch) const; int Find(LPCTSTR lpszSub) const; int Find(TCHAR ch, int nStart) const; int Find(LPCTSTR pstr, in nStart) const; 比如下面的代碼在字符串str中從第5個字符開始查找字符串"jingle、、、、 |