MFC字串操作(一)MFC CString 成員函式用法大全
CString的建構函式
CString( );
例:CString csStr;
CString( const CString& stringSrc );
例:CString csStr("ABCDEF中文123456");
CString csStr2(csStr);
CString( TCHAR ch, int nRepeat = 1 );
例:CString csStr('a',5);
//csStr="aaaaa"
CString( LPCTSTR lpch, int nLength );
例:CString csStr("abcdef",3);
//csStr="abc"
CString( LPCWSTR lpsz );
例:wchar_t s[]=L"abcdef";
CString csStr(s);
//csStr=L"abcdef"
CString( const unsigned char* psz );
例:const unsigned char s[]="abcdef";
const unsigned char* sp=s;
CString csStr(sp);
//csStr="abcdef"
CString( LPCSTR lpsz );
例:CString csStr("abcdef");
//csStr="abcdef"
int GetLength( ) const;
返回字串的長度(字串中的位元組計數),不包含結尾的空字元。
例:csStr="ABCDEF
printf("%d",csStr.GetLength()); //16
說明:此成員函式用來獲取這個CString 物件中的位元組計數。這個計數不包括結尾的空字元。 對於多位元組字符集(MBCS),GetLength 按每一個8 位字元計數;即,在一個多位元組字元中的開始和結尾位元組被算作兩個位元組。
void MakeReverse( );
顛倒字串的順序
例:csStr="ABCDEF中文123456";
csStr.MakeReverse();
cout<<csStr; //654321文中
void MakeUpper( );
將小寫字母轉換為大寫字母
例:csStr="abcdef中文123456";
csStr.MakeUpper();
cout<<csStr; //ABCDEF中文123456
void MakeLower( );
將大寫字母轉換為小寫字母
例:csStr="ABCDEF中文123456";
csStr.MakeLower();
cout<<csStr; //abcdef中文123456
int Compare( LPCTSTR lpsz ) const;
區分大小寫比較兩個字串,相等時返回0,大於時返回1,小於時返回-1
例:csStr="abcdef中文123456";
csStr2="ABCDEF中文123456";
cout<<csStr.CompareNoCase(csStr2); //0
int CompareNoCase( LPCTSTR lpsz ) const;
不區分大小寫比較兩個字串,相等時返回0,大於時返回1,小於時返回-1
例:csStr="abcdef中文123456";
csStr2="ABCDEF中文123456";
cout<<csStr.CompareNoCase(csStr2); //-1
int Delete( int nIndex, int nCount = 1 )
刪除字元,刪除從下標nIndex開始的nCount個字元
例:csStr="ABCDEF";
csStr.Delete(2,3);
cout<<csStr; // ABF//當nIndex過大,超出對像所在記憶體區域時,函式沒有任何操作。//當nIndex為負數時,從第一個字元開始刪除。//當nCount過大,導致刪除字元超出對像所在記憶體區域時,會發生無法預料的結果。//當nCount為負數時,函式沒有任何操作。
int Insert( int nIndex, TCHAR ch )int Insert( int nIndex, LPCTSTR pstr )
在下標為nIndex的位置,插入字元或字串。返回插入後物件的長度
例:csStr="abc";
csStr.Insert(2,'x');
cout<<csStr; //abxc
csStr="abc";
csStr.Insert(2,"xyz");
cout<<csStr; //abxyzc
//當nIndex為負數時,插入在物件開頭//當nIndex超出物件末尾時,插入在物件末尾
int Remove( TCHAR ch );
移除物件內的指定字元。返回移除的數目
例:csStr="aabbaacc";
csStr.Remove('a');
cout<<csStr; //bbcc
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
返回值:返回被替換的字元數。如果這個字串沒有改變則返回零。
引數:chOld 要被chNew 替換的字元。
chNew 要用來替換chOld 的字元。
lpszOld 一個指向字串的指標,該字串包含了要被lpszNew 替換的字元。
LpszNew 一個指向字串的指標,該字串包含了要用來替換lpszOld 的字元。
說明:此成員函式用一個字元替換另一個字元。函式的第一個原形在字串中用chNew
現場替換chOld。函式的第二個原形用lpszNew 指定的字串替換lpszOld 指定的子串。
在替換之後,該字串有可能增長或縮短;那是因為lpszNew 和lpszOld 的長度
不需要是相等的。兩種版本形式都進行區分大小寫的匹配。
示例:
// 第一個例子,old 和new 具有相同的長度。
CString strZap( “C - -” );
int n = strZap.Replace('-', '+' );
ASSERT( n == 2 );
ASSERT(strZap == “C++” );
// 第二個例子,old 和new 具有不同的長度
CString strBang( “Everybody likes ice hockey” );
n = strBang.Replace( “hockey”, “golf” );
ASSERT( n ==1 );
n = strBang.Replace ( “likes” , “plays” );
ASSERT( n == 1 );
n = strBang.Replace( “ice”, NULL );
ASSERT( n == 1 );
ASSERT( strBang == “Everybody plays golg” );
// 注意,現在在你的句子中有了一個額外的空格。
// 要移走這個額外的空格,可以將它包括在要被替換的字串中,例如,“ice ”。
void TrimLeft( );void TrimLeft( TCHAR chTarget );
說明:如果沒有引數,從左刪除字元(\n\t空格等),至到遇到一個非此類字元. 當然你也可以指定刪除那些字元. 如果指定的引數是字串,那麼遇上其中的一個字元就刪除.
\n 換行符
\t TAB字元
示例1:
CString str = "\n\t a";
str.TrimLeft();
str為“a”;
示例2:
CString str = "abbcadbabcadb ";
str.TrimLeft("ab");
結果"cadbabcadb "
str.TrimLeft("ac");
結果"bcadbabcadb "
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//無引數時刪除空格
void Empty( );
清空
例:csStr="abcdef";
csStr.Empty();
printf("%d",csStr.GetLength()); //0
BOOL IsEmpty( ) const;
測試物件是否為空,為空時返回零,不為空時返回非零
例:csStr="abc";
cout<<csStr.IsEmpty(); //0;
csStr.Empty();
cout<<csStr.IsEmpty(); //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為開始查詢的位置。未找到匹配時返回-1,否則返回字串的開始位置
例:csStr="abcdef";
cout<<csStr.Find('b'); //1
cout<<csStr.Find("de"); //3
cout<<csStr.Find('b',3); //-1
cout<<csStr.Find('b',0); //1
cout<<csStr.Find("de",4); //-1
cout<<csStr.Find("de",0); //3
//當nStart超出物件末尾時,返回-1//當nStart為負數時,返回-1
int FindOneOf( LPCTSTR lpszCharSet ) const;
查詢lpszCharSet中任意一個字元在CString物件中的匹配位置。未找到時返回-1,否則返回字串的開始位置
例:csStr="abcdef";
cout<<csStr.FindOneOf("cxy"); //2
CString SpanExcluding( LPCTSTR lpszCharSet ) const;
返回物件中與lpszCharSet中任意匹配的第一個字元之前的子串
例:csStr="abcdef";
cout<<csStr.SpanExcluding("cf"); //ab
CString SpanIncluding( LPCTSTR lpszCharSet ) const;
從物件中查詢與lpszCharSe中任意字元不匹配的字元,並返回第一個不匹配字元之前的字串
例:csStr="abcdef";
cout<<csStr.SpanIncluding("fdcba"); //abcd
int ReverseFind( TCHAR ch ) const;
從後向前查詢第一個匹配,找到時返回下標。沒找到時返回-1
例:csStr="abba";
cout<<csStr.ReverseFind('a'); //3
void Format( LPCTSTR lpszFormat, ... );void Format( UINT nFormatID, ... );
格式化物件,與C語言的sprintf函式用法相同
例:csStr.Format("%d",13);
cout<<csStr; //13
TCHAR GetAt( int nIndex ) const;
返回下標為nIndex的字元,與字串的[]用法相同
例:csStr="abcdef";
cout<<csStr.GetAt(2); //c//當nIndex為負數或超出物件末尾時,會發生無法預料的結果。
void SetAt( int nIndex, TCHAR ch );
給下標為nIndex的字元重新賦值
例:csStr="abcdef";
csStr.SetAt(2,'x');
cout<<csStr; //abxdef//當nIndex為負數或超出物件末尾時,會發生無法預料的結果。
CString Left( int nCount ) const;
從左取字串
例:csStr="abcdef";
cout<<csStr.Left(3); //abc//當nCount等於0時,返回空。//當nCount為負數時,返回空。//當nCount大於物件長度時,返回值與物件相同。
CString Right( int nCount ) const;
從右取字串
例:csStr="abcdef";
cout<<csStr.Right(3); //def//當nCount等於0時,返回空//當nCount為負數時,返回空//當nCount大於物件長度時,返回值與物件相同
CString Mid( int nFirst ) const;CString Mid( int nFirst, int nCount ) const;
從中間開始取字串
例:csStr="abcdef";
cout<<csStr.Mid(2); //cdef
csStr="abcdef";
cout<<csStr.Mid(2,3); //cde//當nFirst為0和為負數時,從第一個字元開始取//當nFirst等於物件末尾時,返回空字串//當nFirst超出物件末尾時,會發生無法預料的結果//當nCount超出物件末尾時,返回從nFirst開始一直到物件末尾的字串//當nCount為0和為負數時,返回空字串
LPTSTR GetBuffer( int nMinBufLength );
申請新的空間,並返回指標
例:csStr="abcde";
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,"12345");
csStr.ReleaseBuffer();
pStr=NULL;
cout<<csStr //12345//使用完GetBuffer後,必須使用ReleaseBuffer以更新物件內部資料,否則會發生無法預料的結果
返回值:一個指向物件的(以空字元結尾的)字元緩衝區的LPTSTR 指標。
引數:nMinBufLength
字元緩衝區的以字元數表示的最小容量。這個值不包括一個結尾的空字元的空間。
說明:此成員函式返回一個指向CString 物件的內部字元緩衝區的指標。返回的LPTSTR 不是const,因此可以允許直接修改CString 的內容。如果你使用由GetBuffer 返回的指標來改變字串的內容,你必須在使用其它的CString 成員函式之前呼叫ReleaseBuffer 函式。
在呼叫ReleaseBuffer 之後,由GetBuffer 返回的地址也許就無效了,因為其它的CString 操作可能會導致CString 緩衝區被重新分配。如果你沒有改變此CString 的長度,則緩衝區不會被重新分配。當此CString 物件被銷燬時,其緩衝區記憶體將被自動釋放。
注意:如果你自己知道字串的長度,則你不應該新增結尾的空字元。但是,當你用ReleaseBuffer 來釋放該緩衝區時,你必須指定最後的字串長度。如果你添加了結尾的空字元,你應該給ReleaseBuffer 的長度引數傳遞-1 ,ReleaseBuffer 將對該緩衝區執行strlen 來確定它的長度。
示例:
// CString::GetBuffer 例子
CString s( "abcd" );
#ifdef _DEBUG
afxDump << "CString s " << s << "\n";
#endif
LPTSTR p = s.GetBuffer( 10 );
strcpy( p, "Hello" ); // 直接訪問CString 物件
s.ReleaseBuffer( );
#ifdef _DEBUG
afxDump << "CString s " << s << "\n";
#endif
void ReleaseBuffer( int nNewLength = -1 );
使用GetBuffer後,必須使用ReleaseBuffer以更新物件內部資料
例:csStr="abc";
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,"12345");
cout<<csStr.GetLength(); //3(錯誤的用法)
csStr.ReleaseBuffer();
cout<<csStr.GetLength(); //5(正確)
pStr=NULL;
//CString物件的任何方法都應在ReleaseBuffer之後呼叫
//補充
引數:nNewLength
此字串的以字元數表示的新長度,不計算結尾的空字元。如果這個字
符串是以空字元結尾的,則引數的預設值-1 將把CString 的大小設定為
字串的當前長度。
說明:
使用ReleaseBuffer 來結束對由GetBuffer 分配的緩衝區的使用。如果你知道緩
衝區中的字串是以空字元結尾的,則可以省略nNewLength 引數。如果字元
串不是以空字元結尾的,則可以使用nNewLength 指定字串的長度。在呼叫
ReleaseBuffer 或其它CString 操作之後,由GetBuffer 返回的地址是無效的。
示例:
下面的例子說明了如何使用CString::ReleaseBuffer。
// CString::ReleaseBuffer 示例
CString s;
s = "abc";
LPTSTR p = s.GetBuffer( 1024 );
strcpy(p, "abc"); // 直接使用該緩衝區
ASSERT( s.GetLength() == 3 ); // 字串長度 = 3
s.ReleaseBuffer(); // 釋放多餘的記憶體,現在p 無效。
ASSERT( s.GetLength() == 3 ); // 長度仍然是3
LPTSTR GetBufferSetLength( int nNewLength );
申請新的空間,並返回指標
例:csStr="abc";
csStr.GetBufferSetLength(20);
cout<<csStr; //abc
count<<csStr.GetLength(); //20;
csStr.ReleaseBuffer();
count<<csStr.GetLength(); //3;//使用GetBufferSetLength後可以不必使用ReleaseBuffer
注:整理源於網路