您的位置:首页 > 其它

MFC CString 用法小结

2009-11-06 15:42 204 查看
 

 

二     CString 常用方法介绍

1.      初始化方法:

(1)    直接复制,如Cstring=”mingrisoft”;

(2)    通过构造函数初始化,如   CString str(‘ ’,100)//与分配100个字节,填充空格

                                                        char* p=”feiqiang”; Cstring(p);delete p.

(3)    加载工程中的字符串资源,如CString str;str.LoadString(IDS_STR);

(4)    使用CString类的成员函数Format初始化,如CString str; int i=0; str.Format(“value:%d”,i);

2.      将CString转化为char*,如

         CString str=”feqiang”;

         char *p;

         p=str.GetBuffer();

         delete p;

         将char*转化为CString,如:

         char* p=”feiqiang”;

         p[len(p)]=’/0’;

         Cstring str(p);

         char* 和char数组的转化:

         char buf[5] ={‘a’,’b’,’c’};

         char *p;

         p=new char[5];

         p=buf;

         将字符串转化为数字:

         CString str=”12”;

         int i=atoi(str);

         long j=atoll(str);

         float f=atof(str);

         将数字转化为字符串:

         CString str;

         int i=12;

         str.Format(“%d”,i);

         long j=12;

         str,Format(“%ld”,j);

         同理其他类型。

3.      字符串的相关操作即方法的使用:

         (1)    提取字符串中的中文,如

         CString strtext,temp,strres;

         GetLlgItem(IDC_TEXT)->GetWindowText(strtext);//通过ID获取编辑框中的文本

         for(int =/0;i<strtext.GetLength();i++){

                   char ch=strtext.GetAt(i);

                  

                   if(IsDBCSLeadByte(ch)){ //判断字符是否是双字节编码的前一个字节

                            tmp=strtext.Mid(i,2);//截取索引index1到index2的字符[  )

                            i++;

                            stress+=tmp;

}

GetLlgItem(IDC_RESULT)->SetWindowText(strtes);//设置文本框中的文本

}

         (2)    英文字符串首字母大写,如 将以空格符分隔的英文单词的第一个字母大写(小写)

         str.GetAt(i);//提取字符串索引为i个字母

         str.MakeLower();//转化为小写

         tmp.MakeUpper();//转化为大写

         (2)    按制定符号分割字符:

         int pos=str.Find(strchar);//查找字符,如果没找到,则返回0,找到则返回字符的位置,参数可以是字符也可以是字符串

         while(pos>0){

                   str1=str.Left(pos);//取左,参数为字符串的个数

                   str=str.Right(str.GetLength-pos-1);//取右,参数同上

                   tmp.Format(“%s/r/n”,str1);//字符串中/r/n代表回车化行符

                   strres+=tmp;

                   pos=str.Find(strchar);

}

(3)    删除指定的中文:

m_text.GetWindowText(strtxt);

m_text.GetSel(istart,iend);//得到文本框中选中的文本,并且得到文本的头索引和尾索引

if(istart==iend){

         return;

}

str1=strtxt.Left(istart);

if(iend>=strtxt.GetLength()){

         str2=””;

}else{

         str2=strtxt.Right(strtxt.GetLength()-iend);

}

strres+=str1;

strres+=str2;

         (4)    替换字符串:

         strtxt.Replace(strchar,strnew);//用新串替换旧串

         (5)    根据CPoint查找位置:

         CPoint pt;//获取字符串时获取鼠标所在字符串的位置

         int pos=m_text.CharFromPos(pt);//根据pt获取字符串中的位置,即其左侧字符的位置

if(str.IsEmpty()){//判断字符串是否为空

                   m_num.AddString(strres);//文本框追加字符串

}

         将字符转化为大写:ch=ch-32;

         (6)    字符串忽略大小写的比较:

         CString str=”feiqiang”;

         int com=str.CompareNoCase(“mingri”);//如果相等返回0,否则返回-1;

 

         (7)    连接换行符:CString str=”feiqiang/

t”;

         (8)    字符反转:str.MakeReverse();

         (9)    取出首位空格:str.TrimLeft(); str.TrimRight();

                  取出字符串中的所有空格,str.Replace(“ ”,””);

         (10)  在ListBox中查找字符串

int index=::SendMessage(m_stringlist.GetSafeHwnd(),LB_FINDSTRINGEXACT,-1,
(LPARAM)(LPCTSTR)strtext));//通过SendMessage函数向列表控件发送LB_FINDSTRINGEXACT消息来查找指定字符串是否在列表空间中,如果存在则返回索引位置。

         (11)   字符串数组:

                   CString str[5] array;

                   CString str[5]={“feiqiang”,”mingri”,”mr”};

                   for(int i=0;i<5;i++){

                            array.Add(str[i]);//添加元素

}

for(int j=0;j<array.Size(),j++){//字符数组大小

         if(array.Get(j)==”mr”){

         MessageBox(“存在”);

}

}

(12)  设置编码方式:Project/SettingsàPreprocessor,如果要使用DBCS,则添加_MBCS(多个字节编码),如果要使用Unicode,则添加_Unicode,不添加则使用ASCII.

 

二     字符串指针类型

(1)    LPCSTR:32位静态字符串指针,可以直接赋值使用,如LPCSTR str=”mingrisofg”;

(2)    LPSTR:32位字符串指针,如LPSTR str; str=new char[256];

(3)    LPCTSTR:32位UNICODE型静态字符串指针,如 LPCTSTR str=_T(“mingrisoft”);

(4)    LPTSTR: 32位UNICODE型字符串指针,如LPTSTR str=new TCHAR[256];

三     BSTR(进行COM编程时使用的字符串类型)与CString之间的转化:

1.      对BSTR变量赋值时:

BSTR bstr=NULL;

bstr=SysAllocString(L”feiqang”);//从LPCWSTR构造

         SysFreeString(bstr);//释放

将BSTR强制转化为CString,如:

CString str=(CString) bstr;或CString str; BSTR bstr=str.AllocSysString();

2.      _bstr_(对BSTR的包装类),包含的头文件为:”COMDEF.H”

         用法:

         直接赋值:_bstr_t tbstr=”feqiang”;

         给CString对象赋值:CString str=(LPCSTR)tbstr;//LPCSTR str=tbstr;

         将_bsr_转化为BSTR,使用copy函数:BSTR bstr=tbstr.copy(); SysFreeString(bstr);

         BSTR之间赋值给_bstr_对象,如BSTR bstr=SysAllocString(L”mingri”); _bstr_t tbstr=bstr;

四 格式化类型

如:获取并且格式化系统时间

         CTime t=CTime::GetCurrentTime();

         CSTring strtime=t.Format(“%H:%M:%S”);

         MessageBox(strtime;

 

1.CString::IsEmpty

BOOL IsEmpty( ) const;

返回值:如果CString 对象的长度为0,则返回非零值;否则返回0。

说明:此成员函数用来测试一个CString 对象是否是空的。

示例:

下面的例子说明了如何使用CString::IsEmpty。

// CString::IsEmpty 示例

CString s;

ASSERT( s.IsEmpty() );

请参阅 CString::GetLength

 

2.CString::Left

CString Left( int nCount ) const; 

throw( CMemoryException );

返回值:返回的字符串是前nCount个字符。

示例:

CString s( _T("abcdef") );

ASSERT( s.Left(2) == _T("ab") );

 

3.CString::LoadString

BOOL LoadString( UINT nID );

throw( CMemoryException );

返回值:如果加载资源成功则返回非零值;否则返回0。

nID  一个Windows 字符串资源ID。

说明: 此成员函数用来读取一个由nID 标识的Windows 字符串资源,并放入一个已有CString 对象中。

示例:

下面的例子说明了如何使用CString::LoadString。

// CString::LoadString 示例

#define IDS_FILENOTFOUND 1

CString s;

if (! s.LoadString( IDS_FILENOTFOUND ))

 

4.CString::MakeLower

void MakeLower( );  //改变字符的小写

 

5.CString::MakeReverse

void MakeReverse( );  //字符倒置

 

6.CString::MakeUpper

void MakeUpper( );  //改变字符的大写

 

7.CString::Mid
CString Mid( int nFirst ) const;
CString Mid( int nFirst, int nCount ) const;
nCount代表要提取的字符数, nFirst代表要提取的开始索引位置

示例:
CString s( _T("abcdef") );
ASSERT( s.Mid( 2, 3 ) == _T("cde") );

 

8.CString::ReleaseBuffer

void ReleaseBuffer( int nNewLength = -1 );

参数: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

 

9.CString::Remove

int CString::Remove ( TCHAR ch );

返回值:返回从字符串中移走的字符数。如果字符串没有改变则返回零。

参数:ch  要从一个字符串中移走的字符。

说明:此成员函数用来将ch 实例从字符串中移走。与这个字符的比较是区分大小写

的。

示例:

// 从一个句子中移走小写字母'c':

CString str (“This is a test.”);

int n = str.Remove( 't' );

ASSERT( n == 2 );

ASSERT( str ==“This is a es. ” );

 10.CString::Replace

int Replace( TCHAR chOld, TCHAR chNew );

int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );

返回值:返回被替换的字符数。如果这个字符串没有改变则返回零。

参数: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 ”。

 

11.CString::ReverseFind

int ReverseFind( TCHAR ch ) const;

返回值: 返回此CString 对象中与要求的字符匹配的最后一个字符的索引;如果没有找

到需要的字符则返回-1。

参数: ch  要搜索的字符。

说明:此成员函数在此CString 对象中搜索与一个子串匹配的最后一个字符。此函数

类似于运行时函数strrchr。

示例:

// CString::ReverseFind 示例

CString s( "abcabc" );

ASSERT( s.ReverseFind( 'b' ) == 4 );

 

12.CString::Right

CString Right( int nCount ) const; 

throw( CMemoryException );

返回值: 返回的字符串是最后nCount个字符。

CString s( _T("abcdef") );

ASSERT( s.Right(2) == _T("ef") );

 

13.CString:: SetAt

void SetAt( int nIndex, TCHAR ch );

 说明:可以把字符串理解为一个数组,SetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。 Ch 更替字符, 把nIndex位置上的字符 变成ch

 示例:

CString s( "abc" );

s.MakeReverse();

ASSERT( s == "cba" );

 

14.CString::TrimLeft

void TrimLeft( );

void CString::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 "

 

15.CString::TrimRight

void TrimRight( );

void CString::TrimRight( TCHAR chTarget );

void CString::TrimRight( LPCTSTR lpszTargets );

说明:用法类似于上面。

 

16.CString::Compare

int Compare( LPCTSTR lpsz ) const;

返回值:字符串一样返回0,小于lpsz  返回-1,大于lpsz  返回1, 区分大小字符

示例:

CString s1( "abc" );

CString s2( "abd" );

ASSERT( s1.Compare( s2 ) == -1 );

ASSERT( s1.Compare( "abe" ) == -1 

17.CString::CompareNoCase

int CompareNoCase( LPCTSTR lpsz ) const;

返回值: 字符串一样 返回0,小于lpsz  返回-1,大于lpsz  返回1,不区分大小字符

 

18.CString::Collate

int Collate( LPCTSTR lpsz ) const;

同CString::Compare

 

19.CString::CollateNoCase

int CollateNocase( LPCTSTR lpsz ) const;

同CString::CompareNoCase

 

20.CString::CString      //构造函数

CString( );

CString( const CString& stringSrc ); 

CString( TCHAR ch, int nRepeat = 1 ); 

CString( LPCTSTR lpch, int nLength );

CString( const unsigned char* psz ); 

CString( LPCWSTR lpsz );

CString( LPCSTR lpsz );

示例:

CString s1;                     

CString s2( "cat" );              

CString s3 = s2;                 

CString s4( s2 + " " + s3 );        

CString s5( 'x' );                      // s5 = "x"

CString s6( 'x', 6 );                   // s6 = "xxxxxx"

CString s7((LPCSTR)ID_FILE_NEW);        // s7 = "Create a new document"

CString city = "Philadelphia";

 

21.CString::Delete

int Delete( int nIndex, int nCount = 1); 

返回值:是被删除前的字符串的长度

nIndex是第一个被删除的字符,nCount是一次删除几个字符。根据我实验得出的结果:当nCount>要删除字符串的最大长度(GetCount() - nIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。

示例:

CString str1,str2,str3;

char a;

str1 = "nihao";

str2 = "nIhao";

int x;

// int i=(str1 == str2);      

str1.Delete(2,3);

如果nCount(3) > GetCount() – nIndex (5-2)就会执行错误

 

22.CString::Empty

Void Empty( );

返回值:没有返回值  清空操作;

示例:

CString s( "abc" );

s.Empty();

ASSERT( s.GetLength( ) == 0 );

 

23.CString::Find

int Find( TCHAR ch ) const;

int Find( LPCTSTR lpszSub ) const;

int Find( TCHAR ch, int nStart ) const;

int Find( LPCTSTR lpszSub, int nStart ) const;

返回值:  不匹配的话返回 -1;  索引以0 开始; nStar 代表以索引值nStart 的字符开始搜索 ,

即为包含以索引nStart字符后的字符串.

示例:

CString s( "abcdef" );

ASSERT( s.Find( 'c' ) == 2 );

ASSERT( s.Find( "de" ) == 3 );

Cstring str(“The stars are aligned”);

Ing n = str.Find('e',5);

ASSERT(n == 12)

 

24.CString::FindOneOf

int FindOneOf( LPCTSTR lpszCharSet ) const;

返回值:  不匹配的话返回 -1;  索引以0 开始

注意::返回此字符串中第一个在lpszCharSet中也包括字符并且从零开始的索引值

示例:

CString s( "abcdef" );

ASSERT( s.FindOneOf( "xd" ) == 3 ); // 'd' is first match.

 

25.CString::Format

void Format( LPCTSTR lpszFormat, ... );

void Format( UINT nFormatID, ... );

参数:lpszFormat  一个格式控制字符串

nFormatID  字符串标识符

示例:

CString str;

Str.Format(“%d”,13); 

此时Str为13

 

26.CString::GetAt

TCHAR GetAt( int nIndex ) const;

返回值:返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。

 

27.CString::GetBuffer

LPTSTR GetBuffer( int nMinBufLength );

返回值:一个指向对象的(以空字符结尾的)字符缓冲区的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

 

28.CString::GetLength

int GetLength( ) const;

返回值:返回字符串中的字节计数。

说明:此成员函数用来获取这个CString 对象中的字节计数。这个计数不包括结尾的空字符。

对于多字节字符集(MBCS),GetLength 按每一个8 位字符计数;即,在一个多字节字符中的开始和结尾字节被算作两个字节。

示例

下面的例子说明了如何使用CString::GetLength。

// CString::GetLength 示例

CString s( "abcdef" );

ASSERT( s.GetLength() == 6 );

 

29.CString::Insert

int Insert( int nIndex, TCHAR ch ); 

int Insert( int nIndex, LPCTSTR pstr );

返回值:返回修改后的长度,nIndex是字符(或字符串)插入后的索引号例子

示例:

CString str( “HockeyBest”);

 int n = str.Insert( 6, “is” );

 ASSERT( n == str.GetLength( ) ); 

printf( “1: %s/n”, ( LPCTSTR ) str );

 n = str.Insert( 6, ' ' ); 

ASSERT( n == str.GetLength( ) ); 

printf ( “2: %s/n”, (LPCTSTR) STR );

 n = str.Insert(555, ‘1’);

ASSERT( n == str.GetLength ( ) );

 printf ( “3: %s/n”, ( LPCTSTR ) str );

输出

1. Hockeyis Best

2. Hockey is Best

3. Hockey is Best!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息