CString是MFC对字符串的封装, 它包含一个可变长的字符序列, 提供了很多串操作, 使用它比使用其他的字符串类型更加方便. CString没有继承任何类.CString中的各个字符都是TCHAR类型的, 它在UNICODE中是16位, 在普通字符集中是8位.
CString对象可以随着串合并操作而动态增长其长度,而无须用户来对其长度进行专门设置. 你最好把CString看作一个串类型,而不是一个指向字符串的指针; 但CString可以转换为const char*和LPCTSTR类型, 也就是说, 以const char*和LPCTSTR为参数,也可以以CString作为参数进行调用.
一、CString的构造函数
CString类拥有众多的构造函数, 用于以不同的数据类型和不同的方式构造一个字符串对象:
CString(); //无参数的构造函数,产生一个空的CString对象
CString(const CString& stringSrc); //用另一个CString对象的值初始化对象
CString(TCHAR ch, int nRepeat=1);//用一个字符重复若干次来初始化对象
CString(LPCTSTR lpch, int nLength);//用一个字符数组和一定长度来初始化对象
CString(const unsigned char* psz);//从一个无符号字符指针构造对象
CString(LPCWSTR lpsz);//从一个Unicode字符串来构造对象
CString(LPCSTR lpsz);//从一个ANSI字符串构造对象
可以把某些构造函数看作于类型转化。下面是一些例子:
CString s1;
CString s2("big");
CString s3 = s2;
CString s4(S2 + " " + s3);
CString s5(" x"); //s5=" x";
CString s6(" x",7); //s6=" xxxxxxx";
CString s7((LPCSTR)ID_FILE_NEW); //ID_FILE_NEW是一个资源ID
CString city="Beijing";//注意不是同值运算符
二、CString的基本操作
得到字符串长度:即字符串包含的字符数,用函数GetLength,它返回一个int类型的数。
BOOL IsEmpty() const; //判断字符串是否为空
void Empty();//强制字符串长度为0;
TCHAR GetAt(int nIndex) const //得到字符串某位置的字符;(或者用重载后的操作符“[]”)
void SetAt(int nIndex, TCHAR ch)//设置字符串某位置的字符;
operator LPCTSTR;强制转换为字符串指针类型
比如下面的代码得到字符串最后一个字符:
CString str=" aabbcde";
char c1 = str.GetAt(str.GetLength()-1); //c1="e"
char c2 = str[str.GetLength()-1]; //c2="e"
三、字符串赋值、合并与格式化
1. 操作符“=”, “+”, “+=”可用于字符串的赋值与合并,如:
CString str1 = "ssm", str2("dy"), str3;
str3 = str1; //str3 = "ssm";
str3 = str1 + str2; //str3 = "ssmdy";
str3 += str1; //str3="ssmdyssm";
2. 最常用的字符串格式化函数是CString::Format,它根据一个参数字符串(格式控制字符串)和几个变量来格式化一个串。
它的声明为:
void Format(LPCTSTR lpszFormat,...);
void Format(UINT nFormatID, ...);
其中lpszFormat是格式控制字符串,nFormatID是格式控制字符串的资源ID。
函数Format常常用于把其他类型的变量转换为为字符串形式,或者把几个不同类型的值合并成一个字符串的形式。下面代码演示如何把字符(char)、整数(int)、浮点数(float)及其他字符串格式化到一个CString对象。
CString str1, str2, str3;
str1.Format("%c%c", 13, 10);
str2.Format("float:%f, int:%d, hexint:%x", 3.48, 20, 0xFF);
str3.Format("string:%s, formated float:%2.1f", "hehe", 3.14159;
函数Format的参数中不能包含对象本身,比如语句:
str.Format("%s%d", str, 20);
出现在程序中将导致无法预计的后果!改成这样就没问题了:
str1 = str;
str.Format("%s%d", str1, 20);
此外,还有一个函数FormatMessage, 它格式化一个消息字符串,这个函数的参数与Format类似.
3. 函数LoadString用于从一个字符串资源ID得到取得字符串值。函数格式为:
BOOL LoadString(UINT nID);
四、字符串的比较
CString类重载了诸如:“==”、“!=”、“>=”、“>”、“<=”、“<”等比较操作符,并且CString对象和LPCTSTR可以相互比较,如:
CString s1("abc");
CString s2("abd");
ASSERT(s1<s2);
ASSERT("ABC"<s1);
ASSERT是一个宏,当它的参数为false时会弹出一个消息框提示用户,用户可以选择继续运行程序或忽略或退出程序的运行。
CString::Compare对本对象和参数字符串进行比较,返回的值大于、等于、小于0分别表示本对象比参数字符串大、相等、小。
函数CompareNoCase与Compare类似,区别是它不考虑字符的大小写。
五、串提取
串提取函数根据某种原则从串中提取一个子串,相关函数包括:Mid、Left、 Right、SpanIncluding、SpanExcluding。
函数Mid、Left、Right分别根据参数取得字符串中间、左边、右边的子串。它们的声明如下:
CString Mid(int nFirst) const;
//获取从nFirst位置字符开始的子串
CString Mid(int nFirst, int nCount) const;
//获取从nFirst位置的字符开始包含nCount个字符的子串(即到nFirst+nCount-1位置的字符为止)
CString Left(int nCount) const;
//获取左边nCount个字符所构成的子串
CString Right(int nCount) const;
//获取右边nCount个字符所构成的子串
函数SpanIncluding功能是从字符串提取一段这样子串:它从本字符串第一个字符开始,直到遇到不属于特定集合的字符为止(不包含这个字符)。这个字符集合由参数字符串给出。如果字符串所有字符都属于指定字符集合,函数返回整个子串;如果字符串第一个字符不属于指定集合,函数返回空串。SpanIncluding的声明为:
CString SpanIncluding(LPCTSTR lpszCharSet) const;
函数SpanExcluding的功能是从字符串提取这样一段子串:它从本字符串第一个字符开始,直到遇到属于特定集合的字符为止(不包含这个字符)。这个字符集合由参数字符串给出。如果字符串所有字符都不属于指定字符集合,函数返回整个子串;如果字符串第一个字符属于指定集合,函数返回空串。SpanExcluding的声明为:
CString SpanExcluding(LPCTSTR lpszCharSet) const;
如果说Mid、Left、Right三个函数是根据位置来提取子串的话,那么SpanIncluding和SpanExcluding两个函数是根据字符特征来提取子串。
六、串转换
串转换包括对串中字符的增加、删除、大小写变换、子串替换、开头结尾空白字符清除等,相关函数有:MakeUpper、MakeLower、 MakerReverse、 Replace、 Remove、 Insert、 Delete、 TrimLeft、 TrimRight。
(1)把串中所有字母变成大写字母:MakeUpper;相反,MakeLower把串中所有字母变成小写字母。
(2)颠倒串中所有字符的顺序:MakeReverse, 比如"abc”变成"cba“。
(3)子串替换:Replace,这个函数有两种形式,分别用于字符替换和串替换
int Replace (TCHAR chOld, TCHAR chNew);
int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew);
函数返回被替换掉的字符数。
(4)从本串中去掉所有的指定字符:int CString::Remove(TCHAR ch), 这个函数是区分大小写的。
(5)在本串指定位置插入一个字符或字符串:Insert, 这个函数有两种形式:
int Insert(int nIndex, TCHAR ch)
int Insert(int nIndex, LPCTSTR pstr)
(6)在本串指定位置删除一个字符或子串:Delete。
(7)函数TrimLeft和TrimRight分别用来清除串开头和串结尾的空白字符。空白字符包括:空格、Tab、换行符;也可以自己通过函数参数指定要清除哪些字符。TrimLeft的三种不同的形式:
void TrimLeft();
void CString::TrimLeft(TCHAR chTarget);
void CString::TrimLeft(LPCTSTR lpszTargets);
其中参数lpszTargets中包含了要清除的所有字符。
七、串查找
与串查找相关的函数有:Find、ReverseFind、FindOneOf。
完成串查找的基本函数是Find,它从一个串中查找一个字符或指定子串(返回第一个匹配字符或匹配串首字母的位置),并且可以指定查找的起始位置。Find的函数声明是:
int Find(TCHAR ch) const;
int Find(LPCTSTR lpszSub) const;
int Find(TCHAR ch, int nStart) const;
int Find(LPCTSTR pstr, in nStart) const;
比如下面的代码在字符串str中从第5个字符开始查找字符串"jingle、、、、