CString用法总结
概述: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函数
- 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函数
- CString str;
- int dollar = ;
- 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
- //构造函数
- CString s1 = _T("Hello,World!"); //用字符串初始化CString类对象
- CString s2 = s1; //用CString类对象初始化CString类对象
- CString s3(s1, ); //用s1的前5个字符初始化类对象
- CString s4(_T("Hello,World!"), ); //用字符串的前n个字符初始化类对象
- CString s5(_T(''), ); //用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>要做相应操作,则使用类对象调用相应函数,那么该对象的值便被修改
- //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对象的连接可以通过重载运算符+、+=实现。
详细参见上面的内容(二、对象连接)
- //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,只是不区分大小写。
- //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对象
- //CString对象字符串的提取操作
- CString s1 = _T("aabbccddee");
- MessageBox(s1.Left()); //左边四个字符,输出aabb
- MessageBox(s1.Right()); //右边4个字符,输出ddee
- MessageBox(s1.Mid(, )); //输出从第4个位置开始的两个字符,即输出cc
- MessageBox(s1.Mid()); //输出从第4个位置开始到结尾的子串,即输出ccddee
6.CString对象字符串的查找操作
- //CString对象字符串的查找操作
- CString s1 = _T("aabbccbbaa");
- //查找子串
- int p1 = s1.Find(_T("aa")); //第二个参数默认为0, 故p1为0,
- int p2 = s1.Find(_T("aa"), ); //从下表为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的位置开始往后找,p5为6
- int p6 = s1.Find(_T('c'), ); //未找到,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);
- //使用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
- //使用Replace替换字符
- CString s1 = _T("aabbccddaabbccdd");
- int cnt = s1.Replace('a', '#');
- CString s2;
- s2.Format(_T("%d"), cnt);
- MessageBox(s1); //输出##bbccdd##bbccdd
- MessageBox(s2); //输出4
- //使用Delete删除字符
- CString s1 = _T("aabbccdd");
- int len = s1.Delete(, ); //删除bb,len应为6
- CString s2;
- s2.Format(_T("%d"), len);
- MessageBox(s1); //输出aaccdd
- MessageBox(s2); //输出6
- //使用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
- //CString类格式化字符串的方法
- CString s1, s2;
- int cnt = ;
- 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!
- CString s1 = _T(", World!");
- s1.Insert(, _T("Hello")); //s1为"Hello, World!"
- MessageBox(s1);
- CString s2 = _T("ello, World!");
- s2.Insert(, _T('H')); //s2为"Hello, World!"
- MessageBox(s2);
- CString s1 = _T("");
- int n1 = _ttoi(s1); //
- unsigned long long n2 = _tcstoul(s1, , ); //结果123
- long long n3 = _tcstol(s1, , ); //结果为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);
- //char*和CString
- CString s1 = _T("Hello,World!");
- CString s2;
- s2.Format(_T("Hello,World!"));
2.CString转化为char*
<1>强制类型转换为 LPCTSTR
A.这是一种略微硬性的转换,有关"正确"的做法,人们在认识上还存在许多混乱,
正确的使用方法有很多,但错误的使用方法可能与正确的使用方法一样多。
参考:百度百科
CString用法总结的更多相关文章
- C++——CString用法大全
列表形式的如下: CString的构造函数CString( );例:CString csStr; CString( const CString& stringSrc );例:CString c ...
- VC:CString用法整理(转载)
1.CString::IsEmpty BOOL IsEmpty( ) const; 返回值:如果CString 对象的长度为0,则返回非零值:否则返回0. 说明:此成员函数用来测试一个CString ...
- 【转载】C++——CString用法大全
CString常用方法简介 作者:webmaster 出处:无 CString::Compareint Compare( LPCTSTR lpsz ) const;返回值 字符串一样 返回0 ...
- CString用法小结《转载》
http://blog.sina.com.cn/s/blog_a674ea930101aeey.html
- CString.Format的详细用法(转)
CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...
- CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法
一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...
- GetBuffer与ReleaseBuffer的用法,CString剖析
转载: http://blog.pfan.cn/xman/43212.html GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象 ...
- CString 成员函数用法
参考文档:http://www.cnblogs.com/Caiqinghua/archive/2009/02/16/1391190.html CString的构造函数CString( );例:CStr ...
- CString中 format、trimLeft和trimright、trim 和FindOneOf用法
1.format 可以帮助各种类型转换成CString. a. int 转 CString CString str; int number = 4; str.Format(_T("%d&qu ...
随机推荐
- CSU1022
题目: blue和AutoGerk是好朋友.他们的相同点是都喜欢研究算法,不同点是AutoGerk已是大牛而blue还是菜鸟.blue经常拿一些自以为很难的问题去问AutoGerk,想难倒他,但是每次 ...
- Program B 暴力求解
Given a sequence of integers S = {S1,S2,...,Sn}, you should determine what is the value of the maxim ...
- javaweb之Cookie篇
Cookie是在浏览器访问某个Web资源时,由Web服务器在Http响应消息头中通过Set-Cookie字段发送给浏览器的一组数据. 一个Cookie只能表示一个信息对,这个信息对有一个信息名(Nam ...
- android textview 跑马灯
<TextView android:layout_width="match_parent" android:layout_height="48dp" an ...
- redis 详解
什么是redis? redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) Reids的特点 Redis本质上是一个Key-Value类型的内存数据库, ...
- Unity场景道具模型拓展自定义编辑器
(一)适用情况 当游戏主角进入特定的场景或者关卡,每个关卡需要加载不同位置的模型,道具等.这些信息需要先在unity编辑器里面配置好,一般由策划干这事,然后把这些位置道具信息保存在文件,当游戏主角进入 ...
- 嵌套遍历<s:iterator>map=new TreeMap(string,Map(string,User))
//嵌套遍历,先给外层的map(假设是放在root中的,如果放在context的map中,要加#)取个别名,放到Actioncontext中 <s:iterator value="ma ...
- IIS 6.0 401 错误
1.错误号401.1 症状:HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝 分析: 由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无 ...
- 从对SAE的一次授权安全评估浅谈云安全
EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2011-12-20From: http://www.80sec.com/ [ 目录 ...
- java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)