#include <string> #include <algorithm> #include <functional> #include <cctype> using namespace std; inline string& ltrim(string &ss) { int (*pf)(int)=isspace; string::iterator p=find_if(ss.begin(),ss.end(),not1(ptr_fun(pf))); ss.erase(ss.begin(),p); return ss; } inline string& rtrim(string &ss) { int (*pf)(int)=isspace; string::reverse_iterator p=find_if(ss.rbegin(),ss.rend(),not1(ptr_fun(pf))); ss.erase(p.base(),ss.end()); return ss; } inline string& trim(string &st) { ltrim(rtrim(st)); return st; }
http://blog.chinaunix.net/u1/41728/showart_361368.html
http://blog.sina.com.cn/s/blog_4f27dbd50100cuwe.html
string trim(string& s)
{ const string drop = " "; // trim right s.erase(s.find_last_not_of(drop)+1); // trim left return s.erase(0,s.find_first_not_of(drop)); } string ltrim(string& s) { const string drop = " "; // trim left return s.erase(0,s.find_first_not_of(drop)); } string rtrim(string& s) { const string drop = " "; // trim right return s.erase(s.find_last_not_of(drop)+1);
}
很多其他语言的libary都会有去除string类的首尾空格的库函数,但是标准C++的库却不提供这个功能。但是C++string也提供很强大的功能,实现trim这种功能也不难。下面是几种方法:
1.使用string的find_first_not_of,和find_last_not_of方法
/* Filename : StringTrim1.cpp Compiler : Visual C++ 8.0 Description : Demo how to trim string by find_first_not_of & find_last_not_of Release : 11/17/2006 */ # include < iostream > # include < string > std : : string & trim( std : : string & ) ; int main( ) { std : : string s = " Hello World!! " ; std : : cout < < s < < " size:" < < s. size( ) < < std : : endl ; std : : cout < < trim( s) < < " size:" < < trim( s) . size( ) < < std : : endl ; return 0; } std : : string & trim( std : : string & s) { if ( s. empty( ) ) { return s; } s. erase( 0, s. find_first_not_of( " " ) ) ; s. erase( s. find_last_not_of( " " ) + 1) ; return s; }
2.使用boost库中的trim,boost库对提供很多C++标准库没有但是又非常常用和好用的库函数,例如正则表达式,线程库等等。
/* Filename : boostStringTrim.cpp Compiler : Visual C++ 8.0 / ISO C++ (boost) Description : Demo how to boost to trim string Release : 02/22/2007 1.0 */ # include < iostream > # include < string > # include < boost/ algorithm/ string . hpp> using namespace std ; using namespace boost; int main( ) { string s = " hello boost!! " ; trim( s) ; cout < < s < < endl ; }
3.使用template(我用GCC编译不通过,用VS2005却可以)
/* Filename : stringTrim1.cpp Compiler : Visual C++ 8.0 Description : Demo how to trim string by other method. Release : 11/18/2006 */ # include < string > # include < iostream > # include < cwctype> template < class T> std : : basic_string < T> & trim( std : : basic_string < T> & ) ; int main( ) { std : : string s = " Hello World!! " ; std : : cout < < s < < " size:" < < s. size( ) < < std : : endl ; std : : cout < < trim( s) < < " size:" < < trim( s) . size( ) < < std : : endl ; return 0; } template < class T> std : : basic_string < T> & trim( std : : basic_string < T> & s) { if ( s. empty( ) ) { return s; } std : : basic_string < T> : : iterator c; // Erase whitespace before the string for ( c = s. begin( ) ; c ! = s. end( ) & & iswspace ( * c+ + ) ; ) ; s. erase( s. begin( ) , - - c) ; // Erase whitespace after the string for ( c = s. end( ) ; c ! = s. begin( ) & & iswspace ( * - - c) ; ) ; s. erase( + + c, s. end( ) ) ; return s; }