使用过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操作