标准C++的字符串操作
来源:互联网 发布:java支付接口开发流程 编辑:程序博客网 时间:2024/06/03 17:49
使用过MFC会发现CString比std::string好用,而使用过C#,会发现System.String用起来更爽。标准C++是否也可以得心应手地处理字符串呢?答案是肯定的,我接下来 会介绍如何实现以下操作
- 字符串的format
- char*, wchar_t*, _bstr_t, CComBSTR, basic_string, System.String间的转换
- Trim操作
- 字符串的分词
- 字符串与各种类型间的转换
- 字符串的hash操作
字符串的format
CString与System.String都与Format方法,在标准C++如何实现这样的功能呢?有两种方法:
- 使用boost的Format方法
- 使用basic_stringstream
下面我就使用basic_stringstream进行format给出示例:
各种类型字符串间的转换
介绍字符串类型char*,wchar_t*,_bstr_t,CComBSTR,CString,basic_string和System.String间的相互转换
pin_ptr<const wchar_t> addr. wch
char*
wchar_t*
_bstr_t
CComBSTR
CString
basic_string
System.String
char*
----
----
mbstowcs_s
_bstr_t(char*)
CComBSTR(char*)
CString(char*)
string(char*)
gcnew String(char*)
wchar_t*
----
wcstombs_s
----
_bstr_t(wchar_t*)
CComBSTR(wchar_t*)
CString(wchar_t*)
wstring(wchar_t*)
gcnew String(wchar_t*)
_bstr_t
----
(char*)
(wchar_t*)
----
->char*->CComBSTR
.GetBSTR()->CString(BSTR&)
->char*->string(char*)
char*->gcnew String(char*)
CComBSTR
----
->CW2A->strcpy_s
wcscpy_s
_bstr_t()
----
CString()
wstring()
gcnew String()
CStringA
----
strcpy_s
mbstowcs_s
_bstr_t()
CComBSTR()
----
string()
gcnew String()
CStringW
----
wcstombs_s
wcscpy_s
_bstr_t()
CComBSTR()
----
wstring()
gcnew String()
string
----
.c_str()->strcpy_s
mbstowcs_s
.c_str()->_bstr_t()
.c_str()->CComBSTR()
CString()
----
.c_str()->gcnew String()
System.String
PtrToStringChars
->wch ->wcstombs_s
->wch->wcscpy_s
->wch->_bstr_t()
->wch->CComBSTR()
->wch->CString()
->wch->wstring()
----
具体内容请查看:http://msdn.microsoft.com/en-us/library/ms235631.aspx
Trim操作
标准C++中没有提供Trim操作的方法,可以使用boost 的trim实现方案(http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4001757 ),如下代码所示:
但是,我要提醒一点,boost的trim_left_copy, trim_right_copy以及trim没有支持多字节字符(或许是因为写这个实现的不是中国人)。因而上面代码并不能得到预期的效果(如果将string改为wstring可以得到正确的结果)。CString的Trim也不能支持多字节字符,所以说,大家写程序,字符串最好还是使用宽字符,不然就转为宽字符后再做处理。下面贴出我写的Trim函数(宽字节版本):
多字节版本下的Trim方法:
字符串的分词
标准c++没有CString的Tokenize——补充一句,同样的问题,CString不支持MBCS,不信,把中文的标点符号作为分隔符试试,它马上就SB了,不要嫌我烦啊,强烈呼吁同胞在代码中使用宽字符;也没有System.String的Split,那如何对字符串进行分词呢,可以使用boost库或是其他第三方库(这些老外写的库,是否支持MBCS,很令人怀疑,http://ishare.iask.sina.com.cn/f/5164324.html 这是一个朋友总结的字符串分词方法),不过我推荐是使用_tcstok_s,也可以使用轻量级的方法,那就是basic_stringstream与getline的情侣组合。下面给出示例代码:
输出结果为:
_tcstok_s
杨俊
杜俊
杨辉
杨钊
getline
杨俊,杜俊
杨辉和杨钊
需要提出几点:_tcstok_s是支持MBCS的,它会改变源字符串;getline方法,一次只能指定一个分隔符,而且不支持MBCS。
字符串的hash操作
- 标准C---关于字符串操作
- 标准C++的字符串操作
- C标准库函数实现之字符串操作
- C标准库字符串类操作
- c标准下的字符串
- 标准c的io操作
- C标准IO的操作
- C语言的本质(22)——C标准库之字符串操作
- [C++STDlib基础]关于字符串的操作——C++标准库头文件<cstring>
- 标准C中字符串分割的方法
- 操纵 C 风格字符串的标准库函数
- c语言标准字符串函数的使用
- 标准c字符和字符串操作 atof() 函数
- [C++STDLib基础]关于C++string字符串的操作——C++标准库头文件<string>
- 标准C文件操作
- C语言的字符串操作
- C#----格式化字符串的操作
- 操作字符串的 C 函数
- linux 管道学习
- Solaris 上配置cron计划任务
- oracle use_ntl详细解释
- linux查看系统负载
- php最简单MYSQL分页显示方法
- 标准C++的字符串操作
- PIC16F690 最简单的实例
- Android进程间通信
- Android开发之旅:进程与线程
- linux设备驱动学习点滴(一),简单的文件操作
- vim 出现No protocol specified 解决
- 杭电 1013 Digital Roots
- One case in which CBO will make wrong estimation based on accurate and fresh statistics
- powerdesigner创建oracle 数据库表,设置表主键列为自动增长