標籤:
很多其他語言的libary都會有去除string類的首尾空格的庫函數,但是標準C++的庫卻不提供這個功能。但是C++string也提供很強大的功能,實現trim這種功能也不難。下面是幾種方法:
1.使用string的find_first_not_of,和find_last_not_of方法
[cpp] view plaincopy
- /*
- 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++標準庫沒有但是又非常常用和好用的庫函數,例如Regex,線程庫等等。
[cpp] view plaincopy
- /*
- 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卻可以)
[cpp] view plaincopy
- /*
- 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;
- }
split方法
[cpp] view plaincopy
- //注意:當字串為空白時,也會返回一個Null 字元串
- void split(std::string& s, std::string& delim,std::vector< std::string >* ret)
- {
- size_t last = 0;
- size_t index=s.find_first_of(delim,last);
- while (index!=std::string::npos)
- {
- ret->push_back(s.substr(last,index-last));
- last=index+1;
- index=s.find_first_of(delim,last);
- }
[轉]C++ string的trim, split方法