概述:CString是MFC中提供的用于处理字符串的类,是一种很有用的数据类型。
它很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作时方便了很多。
不管怎样,使用CString有很多的特殊技巧,特别对于纯C背景下走出来的程序员来说有点难以学习。
一、前言
CString位于头文件afx.h中,这篇文章就来讨论这些技巧。
参考百度百科并截取部分对我有用的内容记录在这篇随笔中,这篇文章包括以下内容:
<1>CString对象的连接
<2>格式化字符串(包括int转化为CString)
<3>CString类的成员函数
<4>CString转化为int型
<5>CString和char*的相互转化
char*转化为CString
CString转化为char*之一:使用LPCTSTR
CString转化为char*之二:使用CString对象的GetBuffer方法
CString转化为char*之三:和控件的接口
二、对象连接
CString类重载了+运算符,因此CString对象能对直接使用+号进行连接。而不再使用strcat函数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
CString s1, s2, s3; s1 = _T("Hello"); s2 = _T("World"); s3 = s1 + _T(",") + s2 +_T("!"); MessageBox(s3);
注意:MFC编程中,为了兼容Unicode编码,字符串尽量都使用_T()宏
三、格式化字符串
可以利用CString的Format方法使用C风格字符串格式化一个CString对象,而不再使用sprintf函数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
CString str; int dollar = 100; str.Format(_T("I have %d dollars\n"), dollar);
四、成员函数
1.构造函数
CString有很多构造函数,下面只介绍几个常用的:
(注意函数原型的变量名都是我自己起的,源码中名字可能不是这个名字,不过不影响)
(另一个类对象引用名采用other, 字符个数采用n)
<1>用已存在的 CString对象 初始化CString对象
函数原型: CString(const CString& other);
<2>可以使用常量字符串初始化CString对象
函数原型: CString(const LPCTSTR other); //这个原型是我猜的
实例: CString str(_T("Hello,World!"));
<3>将字符串other中的前n个字符拷贝到该CString对象
函数原型: CString(LPCTSTR other,int n);
实例: CString str(_T("Hello,World! this is redundant\n"), 12);
<4>用n个字母ch初始化CString对象
函数原型:CString(TCHAR ch,int n = 1);
实例: CString str('6', 6); //str初始化为6个6,即666666
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//构造函数 CString s1 = _T("Hello,World!"); //用字符串初始化CString类对象 CString s2 = s1; //用CString类对象初始化CString类对象 CString s3(s1, 5); //用s1的前5个字符初始化类对象 CString s4(_T("Hello,World!"), 5); //用字符串的前n个字符初始化类对象 CString s5(_T('6'), 5); //用n个给定的字符初始化类对象 MessageBox(s1); //输出Hello,World! MessageBox(s2); //输出Hello,World! MessageBox(s3); //输出Hello MessageBox(s4); //输出Hello MessageBox(s5); //输出66666
注意:在初始化时使用=运算符调用的是相应类型的构造函数,而不是重载的=运算符,
此外,部分构造函数无法写成=的形式,比如使用n个ch初始化CString对象,使用字符串的前n个字符初始化类对象等
2.CString类的大小写转换及顺序转换函数
<1> 将字符串中的所有大写字符转换为小写字符
函数原型:CString& MakeLower();
<2>将字符串中的所有小写字符转换为大写字符
函数原型:CString& MakeUpper();
<3>将字符串中所有字符的顺序颠倒
函数原型:CString& MakeReverse()
<4>要做相应操作,则使用类对象调用相应函数,那么该对象的值便被修改
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//CString类的大小写转换及顺序转换函数 CString s1 = _T("aaBBCCddEe"); s1.MakeLower(); MessageBox(s1); //输出 aabbccddee s1.MakeUpper(); MessageBox(s1); //输出 AABBCCDDEE MessageBox(s1.MakeLower().MakeReverse()); //输出eeddccbbaa MessageBox(s1); //输出eeddccbbaa
3.CString对象的连接
多个CString对象的连接可以通过重载运算符+、+=实现。
详细参见上面的内容(二、对象连接)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//CString对象的连接 CString s1 = _T("Hello"); CString s2 = _T("World!"); MessageBox(s1 + _T(",") + s2 + _T("!")); //输出Hello,World! s1 += _T(","); s1 += s2; s1 += _T("!"); //s1内容变为Hello,World! MessageBox(s1); //输出Hello,World!
4.CString对象的比较
CString对象的比较可以通过==、!=、<;、>;、<=、>=等重载运算符实现,也可以使用Compare和CompareNoCase成员函数实现。
<1>==,!=,<,>,<=,>=都是根据ASCII值大小(字符串的字典序)进行比较,
返回值为0或1,1表示使用的比较运算符判断成立。
<2>Compare函数类似strcmp函数,相等返回0,
小于传进来的参数则返回小于0的数,大于传进来的参数则返回大于0的数
<3>CompareNoCase类似Compare,只是不区分大小写。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//CString对象的比较 CString s1 = _T("aabbcc"); CString s2 = _T("aabbdd"); CString s3 = _T("AAbbcc"); CString s4 = _T("aabbcc"); //部分运算符用法 int a1 = (s1 == s2); //s1 != s2,a1为0 int a2 = (s1 != s2); //s1 != s2,a2为1 int a3 = (s1 <= s3); //s1 > s3, a3为0, 注意大写字母的ASCII码比较小 CString str1, str2, str3; str1.Format(_T("%d"), a1); str2.Format(_T("%d"), a2); str3.Format(_T("%d"), a3); MessageBox(str1); MessageBox(str2); MessageBox(str3); //Compare用法 int a4 = s1.Compare(s2); //s1 < s2,a4为-1 int a5 = s1.Compare(s3); //s1 > s2,a5为1 int a6 = s1.Compare(s4); //s1 = s2,a6为0 CString str4,str5,str6; str4.Format(_T("%d"), a4); str5.Format(_T("%d"), a5); str6.Format(_T("%d"), a6); MessageBox(str4); MessageBox(str5); MessageBox(str6); //CompareNoCase用法 int a7 = s1.CompareNoCase(s2); //不区分大小写, s1 < s2, a7 = -1 int a8 = s1.CompareNoCase(s3); //不区分大小写, s1 = s2, a8 = 0 int a9 = s1.CompareNoCase(s4); //不区分大小写, s1 = s2, a9 = 0 CString str7, str8, str9; str7.Format(_T("%d"), a7); str8.Format(_T("%d"), a8); str9.Format(_T("%d"), a9); MessageBox(str7); MessageBox(str8); MessageBox(str9);
5.CString对象字符串的提取操作
<1>提取该字符串左边nCount个字符的子字符串,并返回一个包含这个子字符串的拷贝的CString对象
函数原型:CString Left(int nCount) const;
<2>提取该字符串右边nCount个字符的子字符串,并返回一个包含这个子字符串的拷贝的CString对象
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//CString对象字符串的提取操作 CString s1 = _T("aabbccddee"); MessageBox(s1.Left(4)); //左边四个字符,输出aabb MessageBox(s1.Right(4)); //右边4个字符,输出ddee MessageBox(s1.Mid(4, 2)); //输出从第4个位置开始的两个字符,即输出cc MessageBox(s1.Mid(4)); //输出从第4个位置开始到结尾的子串,即输出ccddee
6.CString对象字符串的查找操作
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//CString对象字符串的查找操作 CString s1 = _T("aabbccbbaa"); //查找子串 int p1 = s1.Find(_T("aa")); //第二个参数默认为0, 故p1为0, int p2 = s1.Find(_T("aa"), 1); //从下表为1开始往后找子串aa, 故p2为8 int p3 = s1.Find(_T("abc")); //未找到,返回-1,即-1 CString str1, str2, str3; str1.Format(_T("%d"), p1); str2.Format(_T("%d"), p2); str3.Format(_T("%d"), p3); MessageBox(str1); MessageBox(str2); MessageBox(str3); //查找字符 int p4 = s1.Find(_T('b')); //第二个参数默认为0,p4为2 int p5 = s1.Find(_T('b'), 4); //从标为4的位置开始往后找,p5为6 int p6 = s1.Find(_T('c'), 6); //未找到,p6为-1 CString str4, str5, str6; str4.Format(_T("%d"), p4); str5.Format(_T("%d"), p5); str6.Format(_T("%d"), p6); MessageBox(str4); MessageBox(str5); MessageBox(str6);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//使用Replace替换子串 CString s1 = _T("aabbccddaabbccdd"); int cnt = s1.Replace(_T("aa"), _T("##")); CString s2; s2.Format(_T("%d"), cnt); MessageBox(s1); //输出##bbccdd##bbccdd MessageBox(s2); //输出2
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//使用Replace替换字符 CString s1 = _T("aabbccddaabbccdd"); int cnt = s1.Replace('a', '#'); CString s2; s2.Format(_T("%d"), cnt); MessageBox(s1); //输出##bbccdd##bbccdd MessageBox(s2); //输出4
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//使用Delete删除字符 CString s1 = _T("aabbccdd"); int len = s1.Delete(2, 2); //删除bb,len应为6 CString s2; s2.Format(_T("%d"), len); MessageBox(s1); //输出aaccdd MessageBox(s2); //输出6
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//使用Remove删除字符 CString s1 = _T("aabbccdd"); int len = s1.Remove(_T('b')); //len为删除字符个数,应该为2 CString s2; s2.Format(_T("%d"), len); MessageBox(s1); //输出aaccdd MessageBox(s2); //输出2
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//CString类格式化字符串的方法 CString s1, s2; int cnt = 100; const double PI = 3.141592653; s1.Format(_T("I have %d dollars!"), cnt); s2.Format(_T("PI is approximate to %.2f!"), PI); MessageBox(s1); //输出I have 100 dollars! MessageBox(s2); //输出PI is approximate to 3.14!
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
CString s1 = _T(", World!"); s1.Insert(0, _T("Hello")); //s1为"Hello, World!" MessageBox(s1); CString s2 = _T("ello, World!"); s2.Insert(0, _T('H')); //s2为"Hello, World!" MessageBox(s2);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
CString s1 = _T("123"); int n1 = _ttoi(s1); // unsigned long long n2 = _tcstoul(s1, 0, 10); //结果123 long long n3 = _tcstol(s1, 0, 8); //结果为83,八进制123的十进制为83 CString str1, str2, str3; str1.Format(_T("%d"), n1); str2.Format(_T("%llu"), n2); str3.Format(_T("%lld"), n3); MessageBox(str1); MessageBox(str2); MessageBox(str3);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//char*和CString CString s1 = _T("Hello,World!"); CString s2; s2.Format(_T("Hello,World!"));
2.CString转化为char*
<1>强制类型转换为 LPCTSTR
A.这是一种略微硬性的转换,有关"正确"的做法,人们在认识上还存在许多混乱,
正确的使用方法有很多,但错误的使用方法可能与正确的使用方法一样多。
参考:百度百科