轉自:http://www.jizhuomi.com/software/228.html
CString類簡介
CString類作為MFC的常用類,當之無愧。可以這樣說,只要是從事MFC開發,基本都會遇到使用CString類的場合。因為字符串的使用比較普遍,而CString類又提供了對字符串的便捷操作,所以它給MFC開發人員帶來了高的開發效率,受到了開發者的歡迎。
大家使用VS2010的話,可能會見到CStringT,實際上它是一個操作可變長度字符串的模板類。CStringT模板類有三個實例:CString、CStringA和CStringW,它們分別提供對TCHAR、char和wchar_t字符類型的字符串的操作。char類型定義的是Ansi字符,wchar_t類型定義的是Unicode字符,而TCHAR取決於MFC工程的屬性對話框中的Configuration Properties->General->Character Set屬性,如果此屬性為Use Multi-Byte Character Set,則TCHAR類型定義的是Ansi字符,而如果為Use Unicode Character Set,則TCHAR類型定義的是Unicode字符。
三個字符串類的操作是一樣的,只是處理的字符類型不同。雞啄米以CString類為講解對象。
CString類的字符串操作
1. CString類的構造函數
CString類有很多構造函數,這里只介紹幾個比較常用的:
CString(const CString& stringSrc);
將一個已經存在的CString對象stringSrc的內容拷貝到該CString對象。例如:
CString str1(_T("www.jizhuomi.com")); // 將常量字符串拷貝到str1
CString str2(str1); // 將str1的內容拷貝到str2
CString(LPCTSTR lpch, int nLength);
將字符串lpch中的前nLength個字符拷貝到該CString對象。例如:
CString str(_T("www.jizhuomi.com"),3); // 構造的字符串對象內容為"www"
CString(TCHAR ch, int nLength = 1);
使用此函數構造的CString對象中將含有nLength個重復的ch字符。例如:
CString str(_T('w'),3); // str為"www"
2. CString類的大小寫轉換及順序轉換函數
CString& MakeLower();
將字符串中的所有大寫字符轉換為小寫字符。
CString& MakeUpper();
將字符串中的所有小寫字符轉換為大寫字符。
CString& MakeReverse();
將字符串中所有字符的順序顛倒。
例如:
CString str(_T("JiZhuoMi")); str.MakeLower(); // str為"jizhuomi" str.MakeUpper(); // str為"JIZHUOMI" str.MakeReverse(); // str為"IMOUHZIJ"
3. CString對象的連接
多個CString對象的連接可以通過重載運算符+、+=實現。例如:
CString str(_T("jizhuomi")); // str內容為"jizhuomi" str = _T("www.") + str + _T("."); // str為"www.jizhuomi." str += _T("com"); // str為"www.jizhuomi.com"
4. CString對象的比較
CString對象的比較可以通過==、!=、<、>、<=、>=等重載運算符實現,也可以使用Compare和CompareNoCase成員函數實現。
int Compare(PCXSTR psz) const;
將該CString對象與psz字符串比較,如果相等則返回0,如果小於psz則返回值小於0,如果大於psz則返回值大於0。
int CompareNoCase(PCXSTR psz) const throw();
此函數與Compare功能類似,只是不區分大小寫。
例如:
CString str1 = _T("JiZhuoMi"); CString str2 = _T("jizhuomi"); if (str1 == str2) { // 因為str1、str2不相等,所以不執行下面的代碼 ... } if (0 == str1.CompareNoCase(str2)) { // 因為不區分大小寫比較時,CompareNoCase函數返回0,所以執行下面的代碼 ... }
5. CString對象字符串的提取操作
CString Left(int nCount) const;
提取該字符串左邊nCount個字符的子字符串,並返回一個包含這個子字符串的拷貝的CString對象。
CString Right(int nCount) const;
提取該字符串右邊nCount個字符的子字符串,並返回一個包含這個子字符串的拷貝的CString對象。
CString Mid(int iFirst,int nCount) const;
提取該字符串中以索引iFirst位置開始的nCount個字符組成的子字符串,並返回一個包含這個子字符串的拷貝的CString對象。
CString Mid(int iFirst) const;
提取該字符串中以索引iFirst位置開始直至字符串結尾的子字符串,並返回一個包含這個子字符串的拷貝的CString對象。
例如:
CString str1 = _T("jizhuomi"); CString str2 = str1.Left(3); // str2為"jiz" str2 = str1.Right(2); // str2為"mi" str2 = str1.Mid(1,3); // str2為"izh" str2 = str1.Mid(5); // str2為"omi"
6. CString對象字符串的查找操作
int Find(PCXSTR pszSub,int iStart=0) const throw( );
int Find(XCHAR ch,int iStart=0) const throw( );
在CString對象字符串的iStart索引位置開始,查找子字符串pszSub或字符ch第一次出現的位置,如果沒有找到則返回-1。
int FindOneOf(PCXSTR pszCharSet) const throw( );
查找pszCharSet字符串中的任意字符,返回第一次出現的位置,找不到則返回-1。
int ReverseFind(XCHAR ch) const throw();
從字符串末尾開始查找指定的字符ch,返回其位置,找不到則返回-1。這里要注意,盡管是從后向前查找,但是位置的索引還是要從開始算起。
CString str = _T("jizhuomi"); int nIndex1 = str.Find(_T("zh")); // nIndex1的值為2 int nIndex2 = str.FindOneOf(_T("mui")); // nIndex2的值為1 int nIndex3 = str.ReverseFind(_T('i')); // nIndex3的值為7
7. CString類對象字符串的替換與刪除
int Replace(PCXSTR pszOld,PCXSTR pszNew);
用字符串pszNew替換CString對象中的子字符串pszOld,返回替換的字符個數。
int Replace(XCHAR chOld,XCHAR chNew);
用字符chNew替換CString對象中的字符chOld,返回替換的字符個數。
int Delete(int iIndex,int nCount = 1);
從字符串中刪除iIndex位置開始的nCount個字符,返回刪除操作后的字符串的長度。
int Remove(XCHAR chRemove);
刪除字符串中的所有由chRemove指定的字符,返回刪除的字符個數。
例如:
CString str = _T("jizhuomi"); int n1 = str.Replace(_T('i'), _T('j')); // str為"jjzhuomj",n1為2 int n2 = str.Delete(1,2); // str為"jhuomj",n2為6 int n3 = str.Remove(_T('j')); // str為"huom",n3為2
8. CString類的格式化字符串方法
使用CString類的Format成員函數可以將int、short、long、float、double等數據類型格式化為字符串對象。
void __cdecl Format(PCXSTR pszFormat,[, argument]...);
參數pszFormat為格式控制字符串;參數argument可選,為要格式化的數據,一般每個argument在pszFormat中都有對應的表示其類型的子字符串,int型的argument對應的應該是"%d",float型的應對應"%f",等等。
例如:
CString str; int a = 1; float b = 2.3f; str.Format(_T("a=%d,b=%f"), a, b); // str為"a=1,b=2.300000"
關於CString類的內容就講到這里了,用法不少,但仍不全,大家可以查看MSDN深入學習。