CString 是一種很有用的數據類型。它們很大程度上簡化了MFC中的許多操作,使得MFC在做字符串操作的時候方便了很多,CString位於頭文件afx.h中。利用MFC進行編程時,我們從對話框中利用GetWindowText得到的字符串是CString類型,CString是屬於MFC的類。
以下是CString常用成員函數說明:
1、CString::Find
在一個較大的字符串中查找子字符串或字符 ,返回此CString對象中與需要的子字符串或字符匹配的第一個字符的從零開始的索引;如果沒有找到子字符串或字符則返回-1。
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR pstr, int nStart ) const;
其中,nStart 字符串中開始搜索的字符的索引,如果是0,則是從頭開始搜索。如果nStart不是0,則位於nStart之前的字符不包括在搜索之內,但是會包括nStart處的字符。
CString s( "abcdef" );
int n = s.Find( 'c' ); // 結果 n = 2
int f = s.Find( "de" ) ; // 結果 f = 3
CString str("The stars are aligned");
int n = str.Find('e',2); //結果 n = 2
2、CString::Mid
CString Mid( int nFirst, int nCount ) const;
此成員函數從此CString對象中提取一個長度爲nCount個字符的子串,從nFirst(從零開始的索引)指定的位置開始。此函數返回一個對所提取的字符串的拷貝,可能是空的。
nFirst 此CString對象中的要被提取的子串的第一個字符的從零開始的索引。
nCount 要從此CString對象中提取的字符數。如果沒有提供這個參數,則字符串的其餘部分都被提取。
CString s( _T("abcdef") );
ASSERT( s.Mid( 2, 3 ) == _T("cde") );
CString strBuff(buff); //將buff由char*型轉換爲CString型.內容爲0,0,1,1,4
int pos1=0,pos2=0;
pos2 = strBuff.Find(",",pos1);
if (pos2==-1) return FAULSE;
m_screenmode.screen_info[j].x = atoi(strBuff.Mid(pos1,pos2-pos1));
上面的代碼通過Find()和Mid()來獲取逗號之間的內容,依次類推,不斷變化pos1和pos2的值,就可以將每個逗號間的值全都取出來。
3、CString::Replace
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
在替換之後,該字符串有可能增長或縮短;那是因爲lpszNew和lpszOld的長度不需要是相等的。兩種版本形式都進行區分大小寫的匹配。
4、CString::CompareNoCase
函數原型:
int CompareNoCase( LPCTSTR lpsz ) const;
返回值:
該函數對兩個CString對象進行,如果內容完全一致則返回0;如果小於lpsz,則返回爲-1;如果大於lpsz,則返回1。比如,利用CompareNoCase比較str與lpsz,等同於區分大小寫比較str與lpsz的第一個相異字符,如果str該處的字符比lpsz大,則字符串str大於lpsz,返回1;如果str該處的字符比lpsz小,則字符串str小於lpsz,返回-1;str與lpsz內容完全一致則返回0
說明:
此成員函數通過使用通用文本函數_tcsicmp來比較這個CString對象和另一個字符串。此通用文本函數_tcsicmp是在TCHAR.H中定義 的,根據在編譯時設置的字符來與_stricmp,_wcsicmp,或_mbsicmp對應。這些函數的每一個都根據當前使用的代碼頁來進行一次區分大 小寫的比較,而且不會被現場影響。
與Compare的區別
CompareNoCase爲不區分大小寫比較,而Compare爲區分大小寫比較
比如,利用Compare比較str與lpsz,等同於區分大小寫比較str與lpsz的第一個相異字符,如果str該處的字符比lpsz大,則字符串str大於lpsz,返回1;如果str該處的字符比lpsz小,則字符串str小於lpsz,返回-1;str與lpsz內容完全一致則返回0
5、BOOL IsEmpty( ) const;
測試對象是否爲空,爲空時返回零,不爲空時返回非零
例:
csStr="abc";
cout<<csStr.IsEmpty(); //0;
csStr.Empty();
cout<<csStr.IsEmpty(); //1;
6、Trim相關函數:
Trim()方法和TrimStrat()和TrimEnd()方法
這三個方法用於刪除字符串頭尾出現的某些字符。Trim()刪除字符串頭部及尾部出現的空格,刪除的過程爲從外到內,直到碰到一個非空格的字符爲止,所以不管前後有多少個連續的空格都會被刪除掉。TrimStart()只刪除字符串的頭部的空格。TrimEnd()只刪除字符串尾部的空格。
如果這三個函數帶上字符型數組的參數,則是刪除字符型數組中出現的任意字符。如
Trim("abcd".ToCharArray())
就是刪除字符串頭部及尾部出現的a或b或c或d字符,刪除的過程直到碰到一個既不是a也不是b也不是c也不是d的字符才結束。
這裏最容易引起的誤會就是以爲刪除的是”abcd”字符串。如下例:
string s = " from dual union all ";
s = s.Trim().TrimEnd("union all".ToCharArray());
可能有人以爲上面s的最終結果是”from dual”,但真正的結果是”from d”。需要注意的是這種寫法執行的刪除對象是字符數組中出現的任意字符,而不是這些字符連在一起組成的字符串!
void TrimLeft( );
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
從左刪除字符,被刪的字符與chTarget或lpszTargets匹配,一直刪到第一個不匹配的字符爲止
例:
csStr="aaabaacdef";
csStr.TrimLeft('a');
cout<<csStr; //baacdef
csStr="aaabaacdef";
csStr.TrimLeft("ab");
cout<<csStr; //cdef
//無參數時刪除空格
void TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
從右刪除字符,被刪的字符與chTarget或lpszTargets匹配,一直刪到第一個不匹配的字符爲止
例:
csStr="abcdeaafaaa";
csStr.TrimRight('a');
cout<<csStr; //abcdeaaf
csStr="abcdeaafaaa";
csStr.TrimRight("fa");
cout<<csStr; //abcde
//無參數時刪除空格
7、void MakeLower( );
將大寫字母轉換爲小寫字母
例:
csStr="ABCDEF中文123456";
csStr.MakeLower();
cout<<csStr; //abcdef中文123456
8、int ReverseFind( TCHAR ch ) const;
從後向前查找第一個匹配,找到時返回下標。沒找到時返回-1
例:
csStr="abba";
cout<<csStr.ReverseFind('a'); //3
9、int GetLength( ) const;
返回字符串的長度,不包含結尾的空字符。
csStr="ABCDEF中文123456";
printf("%d",csStr.GetLength()); //16
10、 int Replace( TCHAR chOld, TCHAR chNew );
函數原型:
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
作用:替換字串
例:
csStr="abcdef";
csStr.Replace('a','x');
cout<<csStr; //xbcdef
csStr="abcdef";
csStr.Replace("abc","xyz");
cout<<csStr; //xyzdef
相關說明:
_T(“”)是一個宏,他的作用是讓你的程序支持Unicode編碼
因爲Windows使用兩種字符集ANSI和UNICODE,
前者就是通常使用的單字節方式,
但這種方式處理象中文這樣的雙字節字符不方便,
容易出現半個漢字的情況。
而後者是雙字節方式,方便處理雙字節字符。