MFC之CString类及其成员函数用法详解

CString是 CStringT(属于MFC 和 ATL 之间共享的类) 的类模板的专用化,没有基类。在头文件atlstr.h中可以看到CString的定义:

CString对象由可变长度的一队字符组成。CString是基于TCHAR数据类型的对象。如果在你的程序中定义了符号_UNICODE,则TCHAR被定义为类型wchar_t,即16位字符类型;否则,TCHAR被定义为char,即8位字符类型。在UNICODE方式下,CString对象由16位字符组成。非UNICODE方式下,CString对象由8位字符组成。

一 CString的成员函数

CString构造函数构造函数用用来以指定的数据初始化一个新的CString对象。CString 的构造函数原型如下:

CString( );

CString( const CString& stringSrc );

throw( CMemoryException );

CString( TCHAR ch, int nRepeat = 1 );

throw( CMemoryException );

CString( LPCTSTR lpch, int nLength );

throw( CMemoryException );

CString( const unsigned char* psz );

throw( CMemoryException );

CString( LPCWSTR lpsz );

throw( CMemoryException );

CString( LPCSTR lpsz );

throw( CMemoryException );

参数:

|-----------|-----------------------------------------|
| stringSrc | 一个已经存在的CString对象,它要被拷贝到此CString对象中。 |
| ch | 要被重复nRepeat次的单个字符。 |
| nRepeat | 要对ch重复的次数。 |
| lpch | 一个指向字符数组的指针,该字符数组的长度是nLength,不包括结尾的空字符。 |
| nLength | pch中的字符的个数。 |
| psz | 一个要被拷贝到此CString对象中去的以空字符结尾的字符串。 |
| lpsz | 一个要被拷贝到此CString对象中去的以空字符结尾的字符串。 |

CString的其他功能函数除构造函数外CString类还有字符串处理、分配/串联、比较、字符提取、字符搜索、转换、归档存储、缓存区访问等功能函数,如下:

GetLength返回CString对象中的字符数。对多字节字符,按8位字符计算;即在一个多字节字符中一个开始和结束字节算作两个字符。原型如下:

int GetLength( ) const;

IsEmpty 测试一个CString对象中是否不含有字符,其原型如下:

BOOL IsEmpty( ) const;

Empty 强制一个字符串的长度为0。其原型如下:

void Empty( );

GetAt 获取指定位置字符。其原型如下:

TCHAR GetAt( int nIndex ) const;

SetAt 设置指定位置字符。其原型如下:

void SetAt( int nIndex, TCHAR ch );

运算符重载

CString重载了 赋值运算符:=,算术运算符:+,+=,比较算术符:==,>, <, >=,<=,!=。其操作结果类似于数值的算术运算以比较运算。

Compare比较两个字符串(大小写敏感),其原型如下:

int Compare( LPCTSTR lpsz ) const;

如果字符串是一样的则返回零;如果CString对象小于lpsz则返回值<0,如果CString对象大于lpsz则返回值>0。

CompareNoCase比较两个字符串(不区分大小写)。其原型如下:

int CompareNoCase( LPCTSTR lpsz ) const;

如果字符串是一样的(不区分大小写)则返回零;如果CString对象小于lpsz(不区分大小写)则返回值<0,如果CString对象大于lpsz(不区分大小写)则返回值>0。

Collate比较两个字符串(大小写敏感,使用现场特别信息),其原型如下:

int Collate( LPCTSTR lpsz ) const;

如果两个字符串是一样的,则返回零;如果CString对象小于lpsz则返回值<0;如果此CString对象大于lpsz则返回值>0。

CollateNoCase比较两个字符串(不区分大小写,使用现场特别信息),其原型如下:

int CollateNocase( LPCTSTR lpsz ) const;

如果字符串是一样的(不区分大小写)则返回零值;如果CString对象小于lpsz(不区分大小写)则返回值<0,如果CString对象大于lpsz(不区分大小写)则返回值>0。

Mid 从字符串中提取部分字符串,其原型如下:

CString Mid( int iFirst ) const;

throw( CMemoryException );

CString Mid( int iFirst, int iCount ) const;

throw( CMemoryException );

参数:

|--------|-----------------------------------------------|
| iFirst | 此CString对象中的要被提取的子串开始位置在源字符串中的位置索引。 |
| iCount | 要从此CString对象中提取的字符数。如果没有提供这个参数,则字符串的其余部分都被提取。 |

Left 提取字符串的左边部分,其原型如下:

CString Left( int nCount ) const;

throw( CMemoryException );

|--------|-----------------------|
| nCount | 要从这个CString对象中提取的字符数。 |

返回一个包含指定范围字符的拷贝的CString对象。注意,返回的CString对象可能是空的。

Right提取字符串的右边部分,其原型如下:

CString Right( int nCount ) const;

throw( CMemoryException );

|--------|-----------------------|
| nCount | 要从这个CString对象中提取的字符数。 |

返回一个包含指定范围字符的拷贝的CString对象。注意,返回的CString对象可能是空的。

SpanIncluding截取字符串一段连续字符或全部字符组成的字符串作为返回的子字符串,子字符开始于字符串中的第一个字符,子字符串中的字符是参照字符串中的字符并且排序相同。其原型如下:

CString SpanIncluding( LPCTSTR lpszCharSet ) const;

throw( CMemoryException );

参数: lpszCharSet 参照字符串。

SpanExcluding截取字符串一段连续字符串,子字符开始于字符串中的第一个字符,且子字符串中的不包含参照字符串中的字符。其原型如下:

CString SpanExcluding( LPCTSTR lpszCharSet ) const;

throw( CMemoryException );

参数: lpszCharSet 参照字符串。

MakeUpper将字符串中的所有字符转换为大写字符。其原型如下:

void MakeUpper( );

MakeLower将字符串中的所有字符转换为小写字符。其原型如下:

void MakeLower( );

MakeReverse将字符串中的字符以倒序排列,其原型如下:

void MakeReverse( );

Replace 用其它字符替换指定的字符。其原型如下:

int Replace( TCHAR chOld, TCHAR chNew );

int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );

参数:

|---------|------------------------------------|
| chOld | 要被chNew替换的字符。 |
| chNew | 要用来替换chOld的字符。 |
| lpszOld | 一个指向字符串的指针,该字符串包含了要被lpszNew替换的字符。 |
| lpszNew | 一个指向字符串的指针,该字符串包含了要用来替换lpszOld的字符。 |

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

Remove去除字符串中指定的字符,其原型如下:

int Remove ( TCHAR ch );

|----|-------------------------------------------------|
| ch | 要从一个字符串中去除的字符。 返回值:返回从字符串中移走的字符数。如果字符串没有改变则返回零。 |

Insert在字符串中的给定索引处插入一个字符或一个子字符串。其原型如下:

int Insert( int nIndex, TCHAR ch );

throw( CMemoryException );

int Insert( int nIndex, LPCTSTR pstr ); throw( CMemoryException );

参数:

|--------|---------------------------|
| nIndex | 某个字符的索引,在这个字符的前面将要进行插入操作。 |
| ch | 要插入的字符。 |
| pstr | 一个指向要被插入的子字符串的指针。 |

返回值:返回被改变的字符串的长度。
Delete从一个字符串中删除一个或多个字符。其原型如下:

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

throw( CMemoryException ) ;

参数:

|--------|---------------|
| nIndex | 要删除的第一个字符的索引。 |
| nCount | 要删除的字符数。 |

返回值:返回已改变的字符串的长度。

Format格式化字符串,其原型如下:

void Format( LPCTSTR lpszFormat, ... );

void Format( UINT nFormatID, ... );

参数:

|------------|---------------------|
| lpszFormat | 一个格式控制字符串。 |
| nFormatID | 包含格式控制字符串的字符串资源标识符。 |

FormatV格式化字符串,其原型如下:

void FormatV( LPCTSTR lpszFormat, va_list argList );

参数:

|------------|------------|
| lpszFormat | 一个格式控制字符串。 |
| argList | 要传递的参数列表。 |

TrimLeft去除字符串中左边指定字符,其原型如下:

CStringT& TrimLeft(XCHAR chTarget );

CStringT& TrimLeft(PCXSTR pszTargets );

CStringT& TrimLeft( );//去除第一个字符最左边空格

参数:

chTarget 含有要去除字符的字符串。

pszTargets 含有要去除字符的字符串的指针。

TrimRight去除字符串中指定字符,其原型如下:

CStringT& TrimRight(XCHAR chTarget );

CStringT& TrimLeftRight(PCXSTR pszTargets );

CStringT& TrimRight( );//去除第一个字符最右边空格

参数:

chTarget 含有要去除字符的字符串。

pszTargets 含有要去除字符的字符串的指针。

Trim截去字符串中字符,返回截去字符后的字符串,其原型如下:

CStringT& Trim(XCHAR chTarget );

CStringT& Trim(PCXSTR pszTargets );

CStringT& Trim( );//去除第一个字符前面的空格

参数:

chTarget 需去除的字符。

pszTargets 含有需去除字符的字符串指针。

复制代码
    Find 查找字符串中的字符或字符串。其原型如下:
int Find(PCXSTR pszSub,int iStart=0) const throw( );
int Find(XCHAR ch,int iStart=0) const throw( );
参数:
     pszSub 搜索的子字符串。
     iStart 字符的索引开始搜索字符串中使用或0开始。
     ch  搜索的单个字符。
返回值:第一个字符的从零开始的索引(本 CStringT 对象的请求匹配的子字符串或字符);-1,如果未找到子字符串或字符。
复制代码
    ReverseFind 方向(从末尾开始)查找字符,返回查到字符的在字符串中的位置位置索引。其原型如下:
        int ReverseFind(XCHAR ch) const throw();
复制代码
    FindOneOf 查找字符串中与指定字符相匹配的第一个字符。其原型如下:
int FindOneOf(PCXSTR pszCharSet) const throw( );
参数:
    pszCharSet  含匹配字符的字符串。
返回值:返回找到字符的位置索引。如果没找到,则返回-1.
复制代码
     GetBuffer 返回一个指向CString对象内存缓冲区的指针。其原型如下:
LPTSTR GetBuffer( int nMinBufLength );
        throw( CmemoryException)
参数:
     nMinBufLengthtion 字符缓冲区的以字符数表示的最小容量。
复制代码
     GetBufferSetLength 返回一个指向CString对象内存缓冲区的指针,字符串被截断为指定的长度 。其原型如下:
        LPTSTR GetBufferSetLength( int nNewLength );
                   throw( CMemoryException );
参数: 

|------------|----------------------------|
| nNewLength | 此CString字符缓冲区的以字符数表示的精确容量。 |

复制代码
    ReleaseBuffer 释放对GetBuffer所返回的缓冲区的控制权。其原型如下:
void ReleaseBuffer( int nNewLength = -1 );
参数: 

|------------|-----------------------------------------------------------------------------|
| nNewLength | 此字符串的以字符数表示的新长度,不计算结尾的空字符。如果这个字符串是以空字符结尾的,则参数的缺省值-1将把CString的大小设置为字符串的当前长度。 |

复制代码
    FreeExtra 通过释放原先为此字符串分配的额外内存来删除此字符串对象的额外开销。其原型如下:
void FreeExtra( );
    LockBuffer 使引用计数无效并保护缓冲区内的数据,其原型如下
LPTSTR LockBuffer( );
返回值:返回一个指向CString对象的指针,或者是一个以NULL结尾的字符串
复制代码
    UnLockBuffer 使引用计数有效并释放缓冲区中的数据,此成员函数用来解锁先前通过调用LockBuffer加锁的的缓冲区。其原型如下:
    void UnlockBuffer( );

二 CString成员函数用法示例

下面用一个示例程序来演示CString类常用成员函数的用法。新建一个控制台应用程序,由于标准C++的std::cout 或C语言的printf 函数并不直接支持Unicode字符串(如UTF-16的wchar_t*字符串),在项目属性的高级选项中将字符集设置为多字节字符集。

在程序中加入如下代码:

// CStringTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include <atlstr.h>
#include <iostream>



using namespace std;

int main()
{
    CString mstr;           //CString 对象声明
    mstr = "同学,你好!";   //赋值测试
    cout << mstr << endl;

    return 0;
}

试运行,结果如下:

CString 构造函数示例

注释掉main函数中的原代码,加入新代码,如下:

int main()
{
    /*
    CString mstr;           //CString 对象声明
    mstr = "同学,你好!";   //赋值示例
    cout << mstr << endl;
    */

    //CString构造函数示例
    CString* pstr = new CString(); //test CString()
    *pstr = "Hello, World!";
    cout << *pstr << endl;

    CString mstr1(*pstr);        //test CString( const CString& stringSrc );
    cout <<"mstr1: " << mstr1 << endl;

    CString mstr2((TCHAR)'A',10); //CString( TCHAR ch, int nRepeat = 1)
    cout <<"mstr2: " << mstr2 << endl;

    CString mstr3("ABCDEFGHIJKLMVOPQRST", 10); //test CString( LPCTSTR lpch, int nLength )
    cout << "mstr3: " << mstr3 << endl;

    char str[] = "Hello, MFC!";
    CString mstr4(str);                       //test CString( const unsigned char* psz )
    cout << "mstr4: " << mstr4 << endl;

    WCHAR str1[11];
    str1[10] = 0;
    for (int i = 0; i < 10; i++)
    {
        str1[i] = 'A' + i;
    }
    CString mstr5(str1);                    //test CString( LPCWSTR lpsz )
    cout << "mstr5: " << mstr5 << endl;

    TCHAR str2[11];
    str2[10] = 0;
    for (int i = 0; i < 10; i++)
    {
        str2[i] = 'a' + i;
    }
    CString mstr6(str2);                    //test CString( LPCSTR lpsz )
    cout << "mstr6: " << mstr6 << endl;

    delete pstr;
    return 0;
}

试运行,结果如下:

CString 函数 GetLength,IsEmpty,Empty,GetAt,SetAt示例

注释掉main函数中原有代码,加入测试代码,如下:

 // CString 函数 GetLength,IsEmpty,Empty,GetAt,SetAt示例
 CString mstr7("CString Function   Test!");
 int len;
 len = mstr7.GetLength();
 TCHAR mc = mstr7.GetAt(len-1);
 mstr7.SetAt(len-7, (TCHAR)'A');
 cout << "len: " << len << endl;
 cout << "mc: " << mc << endl;
 cout << "mstr7: " << mstr7 << endl;

 mstr7.Empty();
 if (mstr7.IsEmpty())
     cout << "mstr7 is empty! " << endl;
 else
     cout << "mstr7:" << mstr7 << endl;
 

 return 0;

试运行,结果如下:

CString 赋值运算符:=,算术运算符:+,+=,比较算术符:==,>, <, >=,<=,!= 示例

注释掉main函数中原有代码,加入测试代码,如下:

 //CString 赋值运算符:=,算术运算符:+,+=,比较算术符:==,>, <, >=,<=,!= 示例
 CString mstr8;
 mstr8 = "ABCD";
 CString mstr9;
 mstr9 = mstr8 + "E";
 mstr8 += "E";
 cout << "mstr8: " << mstr8 << endl;
 cout << "mstr9: " << mstr8 << endl;

 if (mstr8 == mstr9)
 {
     cout << "mstr8 == mstr9" << endl;
     mstr9 += "F";
 }
 
 if (mstr8 != mstr9)
 {
     if (mstr8 > mstr9)
         cout << "mstr8 > mstr9" << endl;
     else
         cout << "mstr8 < mstr9" << endl;
 }

 return 0;

试运行,结果如下:

字符串比较函数Compare, CompareNocase,Collate,CollateNocase示例

注释掉main函数中原有代码,加入测试代码,如下:

 //字符串比较函数Compare, CompareNocase,Collate,CollateNocase示例
 CString mstr10 = "ABCDEfg";
 CString mstr11 = "ABCDEfgh";

 int res_c = mstr10.Compare(mstr11);
 cout <<"mstr10 compare mstr11:" << res_c << endl;

 res_c = mstr11.Compare(mstr10);
 cout << "mstr11 compare mstr10:" << res_c << endl;


 res_c = mstr10.Collate(mstr11);
 cout << "mstr10 collate mstr11:" << res_c << endl;

 res_c = mstr11.Collate(mstr10);
 cout << "mstr11 collate  mstr10:" << res_c << endl;

 cout << "New Cindition:" << endl;

 mstr11 = mstr10;

 res_c = mstr10.Compare(mstr11);
 cout << "mstr10 compare mstr11:" << res_c << endl;

 res_c = mstr11.Compare(mstr10);
 cout << "mstr11 compare mstr10:" << res_c << endl;


 res_c = mstr10.Collate(mstr11);
 cout << "mstr10 collate mstr11:" << res_c << endl;

 res_c = mstr11.Collate(mstr10);
 cout << "mstr11 collate  mstr10:" << res_c << endl;

 return 0;

试运行,结果如下:

CString提取字符串函数Mid,Left,Right, SpanIncluding, SpanExcluding函数示例

注释掉main函数中原有代码,加入测试代码,如下:

 //CString提取字符串函数Mid,Left,Right, SpanIncluding, SpanExcluding函数示例
 CString mStr = "OpenCV Graph API (or G-API) is a new OpenCV module targeted to make regular image processing fast and portable.";
 CString mStr1 = mStr.Mid(12);
 cout << "mStr1 1th: " << mStr1 << endl;

 mStr1 = mStr.Mid(12,16);
 cout << "mStr1 2th: " << mStr1 << endl;

 mStr1 = mStr.Left(12);
 cout << "mStr1 3th: " << mStr1 << endl;

 mStr1 = mStr.Right(18);
 cout << "mStr1 4th: " << mStr1 << endl;

 mStr1 = mStr.SpanIncluding("OpenCV Graph API (or G-API) is a new OpenCV module");
 cout << "mStr1 5th: " << mStr1 << endl;

 mStr1 = mStr.SpanExcluding("i");
 cout << "mStr1 6th: " << mStr1 << endl;

 return 0;

试运行,结果如下:

CString 字符串大小写转换函数MakeUpper,MakeLower及倒序排列MakeReverse用法示例

注释掉main函数中原有代码,加入测试代码,如下:

 //CString 字符串大小写转换函数MakeUpper,MakeLower及倒序排列MakeReverse用法示例
 CString mStr = "OpenCV Graph API (or G-API) is a new OpenCV module targeted to make regular image processing fast and portable.";

 mStr.MakeUpper();
 cout << "mStr 1th: " << mStr << endl;

 mStr.MakeLower();
 cout << "mStr 2th: " << mStr << endl;

 mStr.MakeReverse();
 cout << "mStr 3th: " << mStr << endl;

 return 0;

试运行,结果如下:

CString 替换字符(串)Replace,插入字符Insert,去除字符Remove,Delete函数, 用法示例

注释掉main函数中原有代码,加入测试代码,如下:

 // CString 替换字符(串)Replace,插入字符Insert,去除字符(串)Remove,Delete函数用法示例
 CString mStr = "ABCD";

 mStr.Replace('D', 'E');
 cout << "mStr 1th: " << mStr << endl;

 mStr.Insert(3, "D");
 cout << "mStr 2th: " << mStr << endl;

 mStr.Remove('D');
 cout << "mStr 3th: " << mStr << endl;

 mStr.Insert(3,'D');
 cout << "mStr 4th: " << mStr << endl;

 mStr.Delete(3, 2);
 cout << "mStr 5th: " << mStr << endl;

 return 0;

试运行,结果如下:

CString 类格式化字符串函数Format,FormatV函数的用法示例

注释掉main函数中原有代码,加入测试代码,如下:

//CString 类格式化字符串函数Format,FormatV函数的用法示例
CString mStr = "PI = ";

mStr.Format(_T("%s%.2f"), mStr,3.14);
cout << "mStr 1th: " << mStr << endl;

mStr.Format(_T("当前点的坐标为:(%.2f,%.2f)"), 12.35,47.28);
cout << "mStr 2th: " << mStr << endl;

   
char tem = 'a';
va_list args =&tem ;
mStr.FormatV(_T("%c"),args);
cout << "mStr 3th: " << mStr << endl;

return 0;

试运行,结果如下:

CString类截去字符串中指定字符函数TrimLeft,TrimRight, Trim用法示例

注释掉main函数中原有代码,加入测试代码,如下:

//CString类截去字符串中指定字符函数TrimLeft,TrimRight, Trim用法示例
CString mStr = "OpenCV Graph API (or G-API) is a new OpenCV module targeted to make regular image processing fast and portable.";
CString mStr1 = mStr.TrimLeft(_T("OpenCV"));
cout << "mStr1 1th: " << mStr1 << endl;

mStr1 = "";
mStr1 = mStr.TrimRight(_T(" and portable."));
cout << "mStr1 2th: " << mStr1 << endl;

mStr = "  ABCD";
mStr1 = mStr.Trim();
cout << "mStr1 2th: " << mStr1 << endl;

return 0;

试运行,结果如下:

CString类查找字符串中字符函数Find,ReverseFind,FindOneof用法示例

注释掉main函数中原有代码,加入测试代码,如下:

//CString类查找字符串中字符函数Find,ReverseFind,FindOneof用法示例
CString mStr = "OpenCV Graph API (or G-API) is a new OpenCV module targeted to make regular image processing fast and portable.";
int index = mStr.Find("a");
cout << "index 1th:" << index << endl;

index = mStr.Find('a');
cout << "index 2th:" << index << endl;
   
index = mStr.ReverseFind('a');
cout << "index 3th:" << index << endl;

index = mStr.FindOneOf("is");
cout << "index 3th:" << index << endl;

return 0;

试运行,结果如下:

CString类与缓存相关的函数getBuffer, GetBufferSetLength,ReleaseBuffer,FreeExtra,LockBuffer,Unlockbuffer用法示例

注释掉main函数中原有代码,加入测试代码,如下:

//GetBufferSetLength, ReleaseBuffer, FreeExtra, LockBuffer, Unlockbuffer用法示例
CString mStr = "Hello, World";
cout << mStr << endl;

LPTSTR buffer = mStr.GetBuffer(0);
lstrcpy(buffer, _T("Hello, MFC!"));
mStr.FreeExtra();
mStr.LockBuffer();
cout << mStr << endl;

mStr.UnlockBuffer();
buffer = mStr.GetBuffer(0);
lstrcpy(buffer, _T("Hello, Everybody!"));
mStr.ReleaseBuffer();
cout << mStr << endl;

return 0;

试运行,结果如下:

本博文到此结束,示例源码已上传到CSDN,下载链接为:https://download.csdn.net/download/billliu66/89727356​​​​​​​

相关推荐
白子寰13 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
小芒果_0118 分钟前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
gkdpjj24 分钟前
C++优选算法十 哈希表
c++·算法·散列表
王俊山IT25 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
-Even-28 分钟前
【第六章】分支语句和逻辑运算符
c++·c++ primer plus
我是谁??1 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
发霉的闲鱼2 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt2 小时前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
xiaoxiao涛2 小时前
协程6 --- HOOK
c++·协程
羊小猪~~4 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio