C++ 的字符串处理
来源:互联网 发布:差额比例计算法 编辑:程序博客网 时间:2024/06/02 10:15
曾经有一篇关于C++程序写作的文章,文章说C++程序员要花费20%的时间来处理字符串方面的细节问题,甚至更多。可见C++中的字符处理是相当复杂,原因是C++中有着丰富的字符及字符串类,如STL中的string,wstring,char,wchar_t、还有windows C程序写作中PTSTR,PWSTR,PTSTR,MFC及ATL中的CString, BSTR,_bstr_t,CComBSTR,OLESTR,还有一种随编译时是否预定义了UNICODE而被分析为具体类型的TCHAR及这些字符,或封装类的一大把函数。而我们要用的系统函数,标准库函数或其它库函数。有的要这种字符而没有提供接受其它字符的版本。这些原因也就促使了C++程序员往往要花许多的时间来处理字符串。上次和朋友聊到写代码的话题。他说一天只能写三百来行的代码。确实要写高效的,高质量的C++代码很要下一番功夫。 在上面介绍了许多的字符串,及字符串封装类。实际上所有的这些类都最终可归结为C风格字符串,也就是字符数组。目前字符的编码方案主要有单字节字符(ANSI)编码,多字节字符(MBCS)编码,还有就是UNICODE编码。前两种字符编码的字符还都是用char这个数据类型来维护。当是多字节时典型的就是2个字节时,就会用2个char来存储,一个字节时就会用一个char来存储。这就是串中的字符占多少个字节得看具体的字符,不能像原来一样一个一个地数就可以知道会占多少个字节。UNICODE则简化了这种编码方案,让每个字符都占用相同大小的字节,UNICODE 中的字符是用wchar_t来定义的,这中编码方案则是每个字符都占用两个字节。在这种编码方案下我们又可以一个一个地数来算出占用了多少字节,计算机可以用一种统计方式来处理这种字符串了。虽然牺牲了些内存,但换取了逻辑的简单性。 这里我写了几个工具函数,可以方便地在各种数据类型之间进行转换。我认为这几个函数会对处理字符串提供帮助,所在我就在首页发表了。大家有什么好的想法可以回复我。另我这两天会封装MSXML来操作XML,希望大家能给点意见。到时我可以与相关参与的人员共享这个封装。
1/**//**//**/////////////////////////////////////////////////////////////////////////// 2// Module: stringutility.h 3// Conversion among wchar_t, char and TCHAR 4// 5/**//**//**/////////////////////////////////////////////////////////////////////////// 6#ifndef _STRINGUTILITY_H_ 7#define _STRINGUTILITY_H_ 8 9/**//**//**/////////////////////////////////////////////////////////////////////////// 10// get PSTR by PWSTR 11// This function malloc some memory and you must free it 12inline char* newPSTRFromPWSTRT(PWSTR source) 13{ 14 char *pCh = NULL; 15 int nLength = 0; 16 if(!source) 17 { 18 pCh = new char[1]; 19 } 20 else 21 { 22 nLength= wcslen(source); 23 pCh = new char[2 * nLength + 1]; 24 WideCharToMultiByte(CP_ACP, 25 0, 26 source, 27 -1, 28 pCh, 29 nLength * 2, 30 NULL, 31 NULL); 32 } 33 pCh[2 * nLength] = '/0'; 34 return pCh; 35} 36 37/**//**//**/////////////////////////////////////////////////////////////////////////// 38// get PWSTR by PSTR 39// This function malloc some memory and you must free it 40inline wchar_t* newPWSTRFromPSTR(PSTR source) 41{ 42 wchar_t *pCh = NULL; 43 int nLength = 0; 44 if(!source) 45 { 46 pCh = new wchar_t[1]; 47 } 48 else 49 { 50 nLength = strlen(source); 51 pCh = new wchar_t[nLength + 1]; 52 MultiByteToWideChar(CP_ACP, 53 0, 54 source, 55 -1, 56 pCh, 57 nLength); 58 } 59 pCh[nLength] = '/0'; 60 return pCh; 61} 62 63/**//**//**/////////////////////////////////////////////////////////////////////////// 64// get PSTR by PTSTR 65// This function malloc some memory and you must free it 66 67inline char* newPSTRFromPTSTR(PTSTR source) 68{ 69#ifdef UNICODE 70 return newPSTRFromPWSTRT(source); 71#else 72 char* pCh; 73 int iLength = 0; 74 if(!source) 75 { 76 pCh = new char[1]; 77 } 78 else 79 { 80 iLength = strlen(source); 81 pCh = new char[iLength +1]; 82 strcpy(pCh, source); 83 } 84 pCh[iLength] = '/0'; 85 return pCh; 86#endif 87} 88 89/**//**//**/////////////////////////////////////////////////////////////////////////// 90// get PWSTR by PTSTR 91// This function malloc some memory and you must free it 92 93inline wchar_t* newPWSTRFromPTSTR(PTSTR source) 94{ 95#ifdef UNICODE 96 wchar_t *pCh = NULL; 97 int nLength = 0; 98 if(!source) 99 {100 pCh = new wchar_t[1];101 }102 else103 {104 nLength = wcslen(source);105 pCh = new wchar_t[nLength + 1];106 wcscpy(pCh, source);107 }108 pCh[nLength] = L'/0';109 return pCh;110#else111 return newPWSTRFromPTSTR(source);112#endif113}114115116/**//**//**///////////////////////////////////////////////////////////////////////////117// get PTSTR by PSTR118// This function malloc some memory and you must free it119inline TCHAR* newPTSTRFromPSTR(PSTR source)120{121#ifdef UNICODE122 return newPWSTRFromPSTR(source);123#else124 return newPSTRFromPTSTR(source);125#endif126}127128/**//**//**///////////////////////////////////////////////////////////////////////////129// get PTSTR by PWSTR130// This function malloc some memory and you must free it131inline TCHAR* newPTSTRFromPWSTR(PWSTR source)132{133#ifdef UNICODE134 return newPWSTRFromPTSTR(source);135#else136 return newPSTRFromPWSTRT(source);137#endif138}139#endif // end of #ifndef _STRINGUTILITY_H_
posted on 2008-07-11 23:07 Robertxiao 阅读(307) 评论(4) 编辑 收藏 引用 所属分类: C++
2008-07-11 23:46 gohan
- 字符串的处理[C#]
- c字符串的处理
- Objective-C 字符串的处理
- C语言字符串的处理
- C语言的字符串处理
- C语言字符串处理的库函数
- C++/CLI 的封送处理 - 字符串
- C字符串处理函数的实现
- C字符串处理函数的实现
- 不熟悉的C字符串处理函数
- C语言字符串处理的一个例子
- C语言字符串处理的库函数
- C语言字符串处理的库函数
- C语言字符串处理的库函数
- C语言字符串处理的库函数
- c 字符串处理 通配符的应用
- C语言中字符串的处理方式
- C语言字符串处理的库函数
- FormsAuthentication的用法
- 有意思的中间人攻击
- C# 打印
- 以后有事没事上来写写~~~~
- [转载]Struts2配置文件中传递参数的一个小问题
- C++ 的字符串处理
- WIN32 工具栏贴图背景图的实现
- C++ , CppUnit , assert
- 程序员要做多久?
- 线程池与工作队列
- 数字电视的几个易混淆概念
- 社区赢利的八个法则只看楼主
- VC中用简易方法实现淡入淡出的启动画面
- 用CSS设计纵向导航菜单(div+h1+h2)
评论
WideCharToMultiByteMultiByteToWideChar包装了这两个API,挺好, 回复 更多评论
# re: C++ 字符串操作初析 2008-07-12 07:31 路缘
楼主所言极是,确实在字符串处理方面有点伤神,有时一个项目用到了几个第三方库,常常由于函数接口的字符串类型不一致,需进行调整扩展。 回复 更多评论
# re: C++ 字符串操作初析 2008-07-12 12:39 空明流转
我现在就用wstring和string两种东西。。。其他的基本不用了。那点效率我也不大稀罕的。至于XML,何必用MSXML,普通的DOM用TinyXML就很好了。如果你要支持DTD或者XML Schema这样的除外。 回复 更多评论
# re: C++ 字符串操作初析 2008-07-12 15:11 lotus
推荐开源c++ 库,http://pocoproject.org/,里面对std::string 进行了一些扩展,个人觉得不错 回复 更多评论