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 ...
随机推荐
- Hibernate中的组合映射
1.实体bean设计 car: public class Car { private int id; private String name; private Wheel wheel; set... ...
- Eclipse快捷键 10个最有用的快捷键---摘录
55 48 Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到 ...
- 响应式架构:消息模式Actor实现与Scala、Akka应用集成
这是一本最近很流行的书. 有时间就去看看
- 关于process
http://docs.oracle.com/javase/1.5.0/docs/api/ The ProcessBuilder.start() and Runtime.exec methods cr ...
- Code is not literature
http://www.gigamonkeys.com/code-reading/ I have started code reading groups at the last two companie ...
- js 微信分享
一. //js接口 var shareme; var urls = window.location.href; if(isWeiXin()){ var weifileref=document.cr ...
- 【Tsinghua OJ】范围查询(Range)问题
[问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...
- 【LEETCODE OJ】Clone Graph
Problem link: http://oj.leetcode.com/problems/clone-graph/ This problem is very similar to "Cop ...
- 基于HTTP Live Streaming(HLS) 搭建在线点播系统
1. 为何要使用HTTP Live Streaming 可以参考wikipedia HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议.是 ...
- ZJOI 仓库建设 (斜率DP)
f[i]=min(f[j]+w[j,i])+c[i]; j∈[0,i-1] w[j,i]=p[j+1]*(x[i]-x[j+1])+...+p[i]*(x[i]-x[i]); 最裸的DP是n^2的, ...