1. 程式人生 > >MFC字串操作(一)MFC CString 成員函式用法大全

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
中文123456";
    printf("%d",csStr.GetLength());       //16

說明:此成員函式用來獲取這個CString 物件中的位元組計數。這個計數不包括結尾的空字元。 對於多位元組字符集(MBCS),GetLength 按每一個位字元計數;即,在一個多位元組字元中的開始和結尾位元組被算作兩個位元組。 


void MakeReverse( );
顛倒字串的順序
例:csStr="ABCDEF中文123456";
    csStr.MakeReverse();
    cout<<csStr;                  //654321文中

FEDCBA

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( hockeygolf” ); 

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 );
從左刪除字元,被刪的字元與chTargetlpszTargets匹配,一直刪到第一個不匹配的字元為止
例: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 );
從右刪除字元,被刪的字元與chTargetlpszTargets匹配,一直刪到第一個不匹配的字元為止
例: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//nFirst0和為負數時,從第一個字元開始取//nFirst等於物件末尾時,返回空字串//nFirst超出物件末尾時,會發生無法預料的結果//nCount超出物件末尾時,返回從nFirst開始一直到物件末尾的字串//nCount0和為負數時,返回空字串

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

此字串的以字元數表示的新長度,不計算結尾的空字元。如果這個字

符串是以空字元結尾的,則引數的預設值-將把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(); // 釋放多餘的記憶體,現在無效。

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

注:整理源於網路