关于字符串的处理,我之前一般只停留在string的层面,也没有更加深入的去学习,心里面认为,会用就可以了,没有必要知道为什么是这样?类型到底是什么样子,可就在我稀里糊涂用的时候,却发现了很多乱码跳了出来,这个时候我不得不考虑类型的问题了。今天才知道,string类型原来是basic_string<char>型的一种定义。如果要用到unicode,就要用到wstring,wstring 原来是basic_string<wchar_t>类型的定义。真是火了,后来我用cout输出wstring的字符串,神气般的出问题了,原来要用wcout来输出到流。这个该死的东西,弄的我太丢人了,自认为自己的C++还不错,没有想到今天就这样碰壳了。先看看简单的字符串追加和裁剪的处理,为了能使basic_string<char>和basic_string<wchar_t>都能使用的方法,这里用模板实现,追随大老的踪迹,重现大老的光辉岁月:
/********************************/
//1.追加字符串
//
template <typename T>
void pad(basic_string<T>& s,typename basic_string<T>::size_type n,T c)
{
if (n > s.length())
{
s.append(n - s.length(),c);
}
}
/********************************/
2.裁剪字符串
template <typename T>
void trim(basic_string<T>& s,T c)
{
if (s.empty())
{
return;
}
typename basic_string<T>::iterator ptr;
for (ptr = s.end(); ptr != s.begin() && *--ptr == c;)
{
if (*ptr != c)
{
ptr ++;
}
s.erase(ptr,s.end());
}
}
/********************************/
int _tmain(int argc, _TCHAR* argv[])
{
/***********************************************
string s = "xiaohe is a good boy";
wstring ws_ = L"xiaohe is good boy!";
pad(s,s.length() + 6,'.');
cout << s << endl;
pad(ws_,ws_.length() + 3,L'!');
wcout << ws_ << endl;
/***********************************************/
string _charStr = "hello,boys,,,,";
wstring _wchar_tStr = L"hello,girls!!!!";
trim(_charStr,',');
cout << _charStr << endl;
trim(_wchar_tStr,L'!');
wcout << _wchar_tStr << endl;
/***********************************************/
return 0;
}
因为之前一直看boost,所以对boost里的字符串修剪的方法还是相对比较了解。boost里虽然提供了很多方法,但因为它不是zhu