C\C++学习 公积金相关帖子汇总 魅族M8SDK学习系列不断更新中 Mini开发小组软件发布

[魅族M8] 魅族M8SDK学习系统之CMzString和字符串操作函数

[ 3109 查看 / 6 回复 ]

在C++编程中字符串的使用可谓是五花八门,加上很多都是指针操作更是让新手头痛不已。最近在写程序时也着实被字符串的操作折腾够惨,所以系列文章对字符串的学习足有4篇。此篇将介绍下CmzString和一些常用的字符串操作函数。

1、        CmzSting
魅族SDK提供了一个字符串类,我从开始学习C++是从魅族的例子开始的,所以CmzString使用也是非常的多,但一直就没有仔细的总结过,在代码中也出现过非常的错误都是因为没有正确的使用CmzString造成的。而且CmzString是一个类所以提供了一些常用的字符串操作方法,但并不是很多。

先看看通常是怎么使用CmzString的:
  1. CmzString str;
  2. str = L”你好呀!”;
  3. MzMessageBoxEx(m_hWnd, str, L”hi”);
复制代码
非常简单,和字符串指针使用差不多,有朋友也许会奇怪为什么一个类可以这样直接赋值字符串呢?哪接下来分析一下这个类就会明白了:
先查看下定义:
  1. #ifdef _UNICODE
  2. #ifndef CMzString
  3. #define CMzString CMzStringW
  4. #endif
  5. #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




作者:5207
出处:http://www.mini188.com
本文版权归作者所有,欢迎转载请注明出处,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
本主题由 皇帝 5207 于 2009-7-4 11:50:18 执行 主题分类 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!
欢迎您来到点滴论坛
TOP

Compare和wcscmp的返回值是一样的,他们的具体的区别是什么呢
TOP

原帖由 zjzj 于 2009-4-10 20:14:00 发表
Compare和wcscmp的返回值是一样的,他们的具体的区别是什么呢


Compare是CmzString的方法,而wcscmp是个函数,就像api
相信与不相信都是矛盾的.  5207宣!
欢迎您来到点滴论坛
TOP

这里有设置缓冲区的函数,没有释放缓冲区的函数。。一般什么时候用到啊。
不设的话有没有默认一个范围,CMzstring类的实例会不会出现过大越界的错误啊

还请问一个问题,c++标准库关于字符串操作的函数放在那里啊哪个头文件。初学不知道那里能找到  试包括string.h  Cstring.h好像都不认  是不是Module Name: winbase.h里面的??
TOP

原帖由 zjzj 于 2009-4-14 0:29:00 发表
这里有设置缓冲区的函数,没有释放缓冲区的函数。。一般什么时候用到啊。
不设的话有没有默认一个范围,CMzstring类的实例会不会出现过大越界的错误啊

还请问一个问题,c++标准库关于字符串操作的函数放在那里啊哪个头文件。初学不知道那里能找到  试包括string.h  Cstring.h好像都不认  是不是Module Name: winbase.h里面的??


释放缓冲区,就试试wmemset,CMzString不是有一个ZearMemory函数吗?这个就是了

引用string的话用引用std命名空间
相信与不相信都是矛盾的.  5207宣!
欢迎您来到点滴论坛
TOP

感觉MZ的字符串很乱啊,能告诉我怎么处理列表项的赋值问题啊?
列表框好像有一个listitem的数据类型 ,这个类型 又是怎么回事?还请指教
TOP

回复 6# 忧郁沙 的帖子

官方有例子的啊,我有一篇也介绍了,你找一下吧,我手机上不方便
相信与不相信都是矛盾的.  5207宣!
欢迎您来到点滴论坛
TOP