很多其他语言的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;
-
}
split方法
-
//注意:当字符串为空时,也会返回一个空字符串
-
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);
-
}
-
if (index-last>0)
-
{
-
ret->push_back(s.substr(last,index-last));
-
}