在C++编程中字符串的使用可谓是五花八门,加上很多都是指针操作更是让新手头痛不已。最近在写程序时也着实被字符串的操作折腾够惨,所以系列文章对字符串的学习足有4篇。此篇将介绍下CmzString和一些常用的字符串操作函数。
1、 CmzSting魅族SDK提供了一个字符串类,我从开始学习C++是从魅族的例子开始的,所以CmzString使用也是非常的多,但一直就没有仔细的总结过,在代码中也出现过非常的错误都是因为没有正确的使用CmzString造成的。而且CmzString是一个类所以提供了一些常用的字符串操作方法,但并不是很多。
先看看通常是怎么使用CmzString的:
- CmzString str;
- str = L”你好呀!”;
- MzMessageBoxEx(m_hWnd, str, L”hi”);
复制代码非常简单,和字符串指针使用差不多,有朋友也许会奇怪为什么一个类可以这样直接赋值字符串呢?哪接下来分析一下这个类就会明白了:
先查看下定义:
- #ifdef _UNICODE
- #ifndef CMzString
- #define CMzString CMzStringW
- #endif
- #endif
复制代码会发现是原来CmzStringW才是实实在在的字符串类,而且还检查了是否为Unicode,如果是刚使用CmzString作为CmzStringW的别名,从CMzStringW最后一个字母W来看也足以说明此类是针对wchar_t字符的,这样一来如果以后需要实现了char的字符串类只需要在这个地方增加一个判断就可以了,这对于移植是有用处的。
接着看CmzString的几个构造函数:
CMzStringW(void);默认的构造函数CMzStringW(size_t nSize);构造时指定长度CMzStringW(const CMzStringW &Str);从一个CmzStringW对象初始化CMzStringW(const wchar_t *pStr);从字符串指针初始化再看CmzString提供的函数,用的会比较多:
wchar_t* C_Str() const;这个函数用的会非常地多,因为很多函数都会以wchar_t类型处理,为了使类型匹配CmzString就必须提供一个方法来获取到字符串指针。
size_t Length() const;
获取字符串的长度
bool IsEmpty() const;
检查字符串是否为空
CMzStringW SubStr(int nPosStart, int nCount);
截取一段字符串,nPosStart为开始位置,nCount为截取多少个字符
void ZeroBuffer();
将字符串清0
int Compare(const wchar_t* pStr) const;
比较字符串,传入的参数为wchar_t指针
int Compare(const CMzString& _Str) const;
比较字符串,传入的参数为CmzString地址
介绍完了方法,接下来说个概念:在CmzString类中有很多的方法都带有operator,这在C++里有个概念喊:运算符重载。有兴趣的朋友自己查MSDN去吧。
在CmzStringW中重载了几个常用操作符:=、==、+。
如此一来,CmzStringW类就可以像在表达式中作为左值来使用咯,这就是前面提到的:
CmzString ss = L”您好呀!”
这样的形式就是因为重载了=运算符,C++看到这种表达式就会检查这个类是否重载了=运算符,如果重载了就可以按照此类实现的方法来实现=的功能。
CmzString实现的也不是很复杂,用起来也还凑合,但对于字符串操作比较多的还是自己封闭字符串类得了,或者使用C++标准库中的类。
2、 几个常用的字符串操作函数(都是宽字符函数)(1)、wsprintf格式化字符串,此函数用处较大,但一定要注意类型,举例:
LPTSTR szBuffer=new TCHAR[1024];
CmzString tmpDataDir;
wsprintf(szBuffer, L"%s\\%s", L”C:”, L"txt");
(2)、wcscpy将一个字字符串复制到另一个字符串
(3)、wcsrchr从最后出现指定字符位置开始截取字符串并返回
(4)、wcscmp比较两个字符串是否一致,一致返回0