没有合适的资源?快使用搜索试试~ 我知道了~
首页C++字符串完全指南.doc
C++字符串完全指南.doc
需积分: 13 24 下载量 77 浏览量
更新于2023-03-03
评论 1
收藏 188KB DOC 举报
第一部分 字符串基础部分 2 1.1. 前言 2 1.2. 字符串基础 - ASCII, DBCS, Unicode 2 1.3. 字符串的存储 3 1.4. 字符串处理函数 3 1.5. C字符串函数大全 3 1.6. 字符串遍历 7 1.7. 再谈strxxx() 与_mbsxxx() 8 1.8. Win32 API中的MBCS 和 Unicode的二种字符集 9 1.9. String 和 TCHAR 类型定义 10 1.10. 何时使用TCHAR 和Unicode 11 第二部分 各种字符串类部分 12 2.1. 前言 12 2.2. C语言字符串与类型定义 12 2.3. COM中的字符串 - BSTR 与 VARIANT 14 2.4. 字符串包装类 15 2.4.1. CRT类 _bstr_t 15 2.4.2. _variant_t 15 2.4.3. STL类 16 2.4.4. ATL类 CComBSTR 16 2.4.5. ATL类CComVariant 17 2.4.6. ATL转换宏 17 2.4.7. MFC类 CString 18 2.4.8. WTL类 CString 19 2.4.9. CLR 及 VC 7 类 19 2.4.10. 字符串类的打印格式函数 20 2.4.11. 所有类的总结 20
资源详情
资源评论
资源推荐
C++字符串完全指南
辉 哥
第一部分 字符串基础部分................................................................................................................2
1.1. 前言......................................................................................................................................2
1.2. 字符串基础 - ASCII, DBCS, Unicode...............................................................................2
1.3. 字符串的存储......................................................................................................................3
1.4. 字符串处理函数..................................................................................................................3
1.5. C 字符串函数大全..............................................................................................................3
1.6. 字符串遍历..........................................................................................................................7
1.7. 再谈 strxxx() 与_mbsxxx()..................................................................................................9
1.8. Win32 API 中的 MBCS 和 Unicode 的二种字符集..........................................................9
1.9. String 和 TCHAR 类型定义.............................................................................................11
1.10. 何时使用 TCHAR 和 Unicode........................................................................................11
第二部分 各种字符串类部分..........................................................................................................12
2.1. 前言....................................................................................................................................12
2.2. C 语言字符串与类型定义................................................................................................13
2.3. COM 中的字符串 - BSTR 与 VARIANT........................................................................14
2.4. 字符串包装类....................................................................................................................15
2.4.1. CRT 类 _bstr_t........................................................................................................15
2.4.2. _variant_t.................................................................................................................15
2.4.3. STL 类.....................................................................................................................16
2.4.4. ATL 类 CComBSTR...............................................................................................16
2.4.5. ATL 类 CComVariant..............................................................................................17
2.4.6. ATL 转换宏.............................................................................................................17
2.4.7. MFC 类 CString......................................................................................................18
2.4.8. WTL 类 CString......................................................................................................19
2.4.9. CLR 及 VC 7 类.....................................................................................................19
2.4.10. 字符串类的打印格式函数...................................................................................20
2.4.11. 所有类的总结.......................................................................................................20
第一部分 字符串基础部分
1.1. 前言
注:这是一份个人整理的参考资料,仅供个人学习参考使用,不是权威指南。
字符串的表现形式各异,象 TCHAR,std::string,BSTR 等等,有时还会见到怪怪的用
_tcs 起头的宏。这个指南的目的就是说明各种字符串类型及其用途,并说明如何在必要时
进行类型的相互转换。
在指南的第一部分,介绍三种字符编码格式。理解编码的工作原理是致为重要的。即
使你已经知道字符串是一个字符的数组这样的概念,也请阅读本文,它会让你明白各种字
符串类之间的关系。
指南的第二部分,将阐述各个字符串类,什么时候使用哪种字符串类,及其相互转换。
1.2. 字符串基础 - ASCII, DBCS, Unicode
所有的字符串类都起源于 C 语言的字符串,而 C 语言字符串则是字符的数组。
首先了解一下字符类型。
有三种编码方式和三种字符类型。
第一种编码方式是单字节字符集,称之为 SBCS,它的所有字符都只有一个字节的长
度。ASCII 码就是 SBCS。SBCS 字符串由一个零字节结尾。
第二种编码方式是多字节字符集,称之为 MBCS,它包含的字符中有单字节长的字符,
也有多字节长的字符。Windows 用到的 MBCS 只有二种字符类型,单字节字符和双字节字
符。因此 Windows 中用得最多的字符是双字节字符集,即 DBCS ,通常用它来代替
MBCS。
在 DBCS 编码中,用一些保留值来指明该字符属于双字节字符。例如,Shift-JIS(通用
日语)编码中,值 0x81-0x9F 和 0xE0-0xFC 的意思是:“这是一个双字节字符,下一个字节
是这个字符的一部分”。这样的值通常称为前导字节 (lead byte),总是大于 0x7F。前导字节
后面是跟随字节(trail byte)。DBCS 的跟随字节可以是任何非零值。与 SBCS 一样,DBCS
字符串也由一个零字节结尾。
第三种编码方式是 Unicode。Unicode 编码标准中的所有字符都是双字节长。有时也将
Unicode 称为宽字符集(wide characters),因为它的字符比单字节字符更宽(使用更多内存)。
注意,Unicode 不是 MBCS - 区别在于 MBCS 编码中的字符长度是不同的。Unicode 字符串
用二个零字节字符结尾(一个宽字符的零值编码)。
单字节字符集是拉丁字母,重音文字,用 ASCII 标准定义,用于 DOS 操作系统。双字
节字符集用于东亚和中东语言。Unicode 用于 COM 和 Windows NT 内部。
读者都很熟悉单字节字符集,它的数据类型是 char。双字节字符集也使用 char 数据类
型(双字节字符集中的许多古怪处之一)。Unicode 字符集用 wchar_t 数据类型。Unicode 字符
串用 L 前缀起头,如:
wchar_t wch = L'1'; // 2 个字节, 0x0031
wchar_t* wsz = L"Hello"; // 12 个字节, 6 个宽字符
1.3. 字符串的存储
单字节字符串顺序存放各个字符,并用零字节表示字符串结尾。例如,字符串"Bob"的
存储格式为:
Unicode 编码中,L"Bob"的存储格式为: 用 0x0000 (Unicode 的零编码)结束字符串。
DBCS 看上去有点象 SBCS。以后我们会看到在串处理和指针使用上是有微妙差别的。
字符串"日本语" (nihongo) 的存储格式如下(用 LB 和 TB 分别表示前导字节和跟随字节):
注意,"ni"的值不是 WORD 值 0xFA93。值 93 和 FA 顺序组合编码为字符"ni"。(在高位
优先 CPU 中,存放顺序正如上所述)。
1.4. 字符串处理函数
C 语言字符串处理函数,如 strcpy(), sprintf(),atol()等只能用于单字节字符串。在标准库
中有只用于 Unicode 字符串的函数,如 wcscpy(), swprintf(), _wtol()。
微软在 C 运行库(CRT)中加入了对 DBCS 字符串的支持。对应于 strxxx()函数,DBCS
使用_mbsxxx()函数。在处理 DBCS 字符串(如日语,中文,或其它 DBCS)时,就要用
_mbsxxx()函数。这些函数也能用于处理 SBCS 字符串(因为 DBCS 字符串可能就只含有单字
节字符)。
现在用一个示例来说明字符串处理函数的不同。如有 Unicode 字符串 L"Bob":
x86 CPU 的排列顺序是低位优先(little-endian)的,值 0x0042 的存储顺序为 42 00。这时
如用 strlen()函数求字符串的长度就发生问题。函数找到第一个字节 42,然后是 00,意味着
字符串结尾,于是返回 1。反之,用 wcslen()函数求"Bob"的长度更糟糕。wcslen()首先找到
0x6F42,然后是 0x0062,以后就在内存缓冲内不断地寻找 00 00 直至发生一般性保护错
(GPF)。
strxxx()及其对应的_mbsxxx()究竟是如何运作的?二者之间的不同是非常重要的,直接
影响到正确遍历 DBCS 字符串的方法。下面先介绍字符串遍历,然后再回来讨论 strxxx()和
_mbsxxx()。
1.5. C 字符串函数大全
下面列出了 C 语言字符串中 30 个字符串处理函数:
1. void *memset(void *dest, int c, size_t count);
将 dest 前面 count 个字符置为字符 c.
返回 dest 的值.
2. void *memmove(void *dest, const void *src, size_t count);
从 src 复制 count 字节的字符到 dest. 如果 src 和 dest 出现重叠, 函数会自动处理.
返回 dest 的值.
3. void *memcpy(void *dest, const void *src, size_t count);
从 src 复制 count 字节的字符到 dest. 与 memmove 功能一样, 只是不能处理 src 和 dest 出
现重叠.
返回 dest 的值.
4. void *memchr(const void *buf, int c, size_t count);
在 buf 前面 count 字节中查找首次出现字符 c 的位置. 找到了字符 c 或者已经搜寻了
count 个字节, 查找即停止.
操作成功则返回 buf 中首次出现 c 的位置指针, 否则返回 NULL.
5. void *_memccpy(void *dest, const void *src, int c, size_t count);
从 src 复制 0 个或多个字节的字符到 dest. 当字符 c 被复制或者 count 个字符被复制时,
复制停止.
如果字符 c 被复制, 函数返回这个字符后面紧挨一个字符位置的指针. 否则返回 NULL.
6. int memcmp(const void *buf1, const void *buf2, size_t count);
比较 buf1 和 buf2 前面 count 个字节大小.
返回值< 0, 表示 buf1 小于 buf2;
返回值为 0, 表示 buf1 等于 buf2;
返回值> 0, 表示 buf1 大于 buf2.
7. int memicmp(const void *buf1, const void *buf2, size_t count);
比较 buf1 和 buf2 前面 count 个字节. 与 memcmp 不同的是, 它不区分大小写.
返回值同上.
8. size_t strlen(const char *string);
获取字符串长度, 字符串结束符 NULL 不计算在内.
没有返回值指示操作错误.
9. char *strrev(char *string);
将字符串 string 中的字符顺序颠倒过来. NULL 结束符位置不变.
返回调整后的字符串的指针.
10. char *_strupr(char *string);
将 string 中所有小写字母替换成相应的大写字母, 其它字符保持不变.
返回调整后的字符串的指针.
11. char *_strlwr(char *string);
将 string 中所有大写字母替换成相应的小写字母, 其它字符保持不变.
返回调整后的字符串的指针.
12. char *strchr(const char *string, char c);
查找字符 c 在字符串 string 中首次出现的位置, NULL 结束符也包含在查找中.
返回一个指针, 指向字符 c 在字符串 string 中首次出现的位置, 如果没有找到, 则返回
NULL.
13. char *strrchr(const char *string, int c);
查找字符 c 在字符串 string 中最后一次出现的位置, 也就是对 string 进行反序搜索, 包含
NULL 结束符.
返回一个指针, 指向字符 c 在字符串 string 中最后一次出现的位置, 如果没有找到, 则返
回 NULL.
14. char *strstr(const char *string, const char *strSearch);
在字符串 string 中查找 strSearch 子串.
返回子串 strSearch 在 string 中首次出现位置的指针. 如果没有找到子串 strSearch, 则返
回 NULL. 如果子串 strSearch 为空串, 函数返回 string 值.
15. char *strdup(const char *strSource);
函数运行中会自己调用 malloc 函数为复制 strSource 字符串分配存储空间, 然后再将
strSource 复制到分配到的空间中. 注意要及时释放这个分配的空间.
返回一个指针, 指向为复制字符串分配的空间; 如果分配空间失败, 则返回 NULL 值.
16. char *strcat(char *strDestination, const char *strSource);
将源串 strSource 添加到目标串 strDestination 后面, 并在得到的新串后面加上 NULL 结
束符. 源串 strSource 的字符会覆盖目标串 strDestination 后面的结束符 NULL. 在字符串的复
制或添加过程中没有溢出检查, 所以要保证目标串空间足够大. 不能处理源串与目标串重叠
的情况.
函数返回 strDestination 值.
17. char *strncat(char *strDestination, const char *strSource, size_t count);
将源串 strSource 开始的 count 个字符添加到目标串 strDest 后. 源串 strSource 的字符会
覆盖目标串 strDestination 后面的结束符 NULL. 如果 count 大于源串长度, 则会用源串的长度
值替换 count 值. 得到的新串后面会自动加上 NULL 结束符. 与 strcat 函数一样, 本函数不能
处理源串与目标串重叠的情况.
函数返回 strDestination 值.
18. char *strcpy(char *strDestination, const char *strSource);
复制源串 strSource 到目标串 strDestination 所指定的位置, 包含 NULL 结束符. 不能处理
源串与目标串重叠的情况.
函数返回 strDestination 值.
19. char *strncpy(char *strDestination, const char *strSource, size_t count);
将源串 strSource 开始的 count 个字符复制到目标串 strDestination 所指定的位置. 如果
count 值小于或等于 strSource 串的长度, 不会自动添加 NULL 结束符目标串中, 而 count 大于
strSource 串的长度时, 则将 strSource 用 NULL 结束符填充补齐 count 个字符, 复制到目标串
中. 不能处理源串与目标串重叠的情况.
函数返回 strDestination 值.
20. char *strset(char *string, int c);
将 string 串的所有字符设置为字符 c, 遇到 NULL 结束符停止.
函数返回内容调整后的 string 指针.
21. char *strnset(char *string, int c, size_t count);
剩余20页未读,继续阅读
zhguanghui11
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0