标准C++的字符串操作

使用过MFC会发现CString比std::string好用,而使用过C#,会发现System.String用起来更爽。标准C++是否也可以得心应手地处理字符串呢?答案是肯定的,我接下来 会介绍如何实现以下操作

  1. 字符串的format
  2. char*, wchar_t*, _bstr_t, CComBSTR, basic_string, System.String间的转换
  3. Trim操作
  4. 字符串的分词
  5. 字符串与各种类型间的转换
  6. 字符串的hash操作
  • 字符串的format

CString与System.String都与Format方法,在标准C++如何实现这样的功能呢?有两种方法:

  1. 使用boost的Format方法
  2. 使用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操作 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值