|
[code]
1、CString简介:
提起CString,相信接触过MFC编程开发的小伙伴都不陌生,相反很熟悉。MFC中对于CString字符串的使用可以说是很频繁的,CString类也可以说是MFC中针对字符串的一个封装类。其实CString归属于ATL,不过在MFC中一样使用,而且被重点使用。
2、CString类的方便之处:
在 C语言中,对于字符串的操作有字符串数组,字符串指针之类的,比如:
char* p_str = "hello";
char szbuf[100] = {'h', 'e', 'l', 'l', 'o'};
再对字符串进行拷贝、连接、比较 的时候也要借助 strcpy、strcat、strcmp 之类的函数,而且还要考虑目标空间是否够用之列的,很是麻烦,一旦操作不好就会导致数组越界了,造成缓冲区溢出。
有的网友会说了,C语言的字符串处理确实比较麻烦,但是我可以使用C++ STL 中的 string 啊,这样要比C语言的方便很多吧,比如:
string str = "hello";
str += " world.";
bool is_equal = (str == "123");
这样就不用担心字符串空间是否够用,连接、比较什么的也十分方便,直接 += 或者 == 就可以判断出来了。其实 C++ STL 中的 string 还提供了很多其他的算法,例如:
http://www.cplusplus.com/reference/string/string/
虽然 C++ STL 中的 string 照比C语言中的字符串处理方便很多,但是这里我要说,跟成熟的字符串处理还是差很多,起码跟 CString来说就差了不少。比如:
trim 操作:去除掉首尾的不可见字符,比如回车,制表符,空格之类的;
reverse 操作:进行字符串的首尾颠倒反转;
upper操作:将字符串中的英文全变成大写字母;
lower操作:将字符串中的英文全变成小写字母;
right操作:直接返回字符串中结尾的指定字符;
span_including操作:返回包含指定字符串中任意一个字符的子串
span_excluding操作:返回不包含指定字符串中任意一个字符的子串
format:格式化字符串
replace:替换字符串中的指定字符
stricmp:不区分大小写进行字符串比较
等等吧,这些都没有现成的函数,不可能类似这样简单的操作:
string str = "hello";
str.upper();
直接将字符串变成大写字母的。实际是做不到的,即使能做到也需要好几行代码。但是以上这些操作在 CString 中就相对简单了。可以很轻松的做到,CString早就封装好了这些常用的操作。
例如:
CString str;
3、CString 对于 TCHAR 的封装:
针对当前编码,决定当前内部的指针是 char* 还是 wchar_t*,实际上CString 本身是个模板类,实际上有三种:
typedef ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
复制代码
CStringA 内部使用的是 char*,CStringW 内部使用的是 wchar_t*,CString内部使用的是 TCHAR*,所以 CString 本身会根据当前工程的编码决定使用 char* 还是 wchar_t*,这一点也比较方便。
我们可以先简单使用下 CString,之后改变下工程的编码,看看编译结果就知道了。
4、CString 类对于宽窄字节的转换:
当前工程编码是宽字节Unicode的前提下,CString支持从char* 类型的窄字节字符串来构造和赋值。所以,是可以方便的从窄字节转换到宽字节。但是反之则没有办法实现。
5、使用 CString 类的优缺点:
先来说说优点:
①、使用方便,包含了很多实现好的操作,包括:trim、reverse、format、replace 等等;
②、无缝兼容MFC;
③、自适应当前工程编码,匹配宽窄字节;
④、能实现从窄字节到宽字节的自动转换工作;
再来说说缺点:
①、在非MFC的工程中无法使用,例如:控制台类型的工程,或者Win32类型的API项目;
②、无法完全实现宽窄字节的任意转换;
③、非C++标准,无法跨平台,在除了VC以外的编译器无法使用,更无法在Linux等其他平台上使用。
6、解决方案:
扩展 C++ 标准模板库 STL 中的 string 字符串,使其既方便使用,又可以自由的转换宽窄字节,接下来的课程给大家讲解![/code] |
|