在CodeProject上有朋友说我不应该将空白字符限制在" /t/n/r" 以内,应该使用isspace来实现trim函数,以处理Unicode的空白字符。此话在理,所以将trim的三个函数改了一下。(参阅上一篇《std::string的工具函数》)
string
trimLeft(
const
string
&
str) {
string t = str;
for ( string ::iterator i = t.begin(); i != t.end(); i ++ ) {
if ( ! isspace( * i)) {
t.erase(t.begin(), i);
break ;
}
}
return t;
}
string trimRight( const string & str) {
if (str.begin() == str.end()) {
return str;
}
string t = str;
for ( string ::iterator i = t.end() - 1 ; i != t.begin(); i -- ) {
if ( ! isspace( * i)) {
t.erase(i + 1 , t.end());
break ;
}
}
return t;
}
string trim( const string & str) {
string t = str;
string ::iterator i;
for (i = t.begin(); i != t.end(); i ++ ) {
if ( ! isspace( * i)) {
t.erase(t.begin(), i);
break ;
}
}
if (i == t.end()) {
return t;
}
for (i = t.end() - 1 ; i != t.begin(); i -- ) {
if ( ! isspace( * i)) {
t.erase(i + 1 , t.end());
break ;
}
}
return t;
}
string t = str;
for ( string ::iterator i = t.begin(); i != t.end(); i ++ ) {
if ( ! isspace( * i)) {
t.erase(t.begin(), i);
break ;
}
}
return t;
}
string trimRight( const string & str) {
if (str.begin() == str.end()) {
return str;
}
string t = str;
for ( string ::iterator i = t.end() - 1 ; i != t.begin(); i -- ) {
if ( ! isspace( * i)) {
t.erase(i + 1 , t.end());
break ;
}
}
return t;
}
string trim( const string & str) {
string t = str;
string ::iterator i;
for (i = t.begin(); i != t.end(); i ++ ) {
if ( ! isspace( * i)) {
t.erase(t.begin(), i);
break ;
}
}
if (i == t.end()) {
return t;
}
for (i = t.end() - 1 ; i != t.begin(); i -- ) {
if ( ! isspace( * i)) {
t.erase(i + 1 , t.end());
break ;
}
}
return t;
}
原理很浅显,就是把原来用find_first_of和find_first_not_of实现的查找换成循环,自己用isspace来判断。本来想参考一下boost的实现,不过发现它的代码实在有点复杂,所以还是自己用简单的循环来解决了。
转自:http://blog.csdn.net/jamesfancy/archive/2007/04/02/1549037.aspx