We can write a function to implement this.
1 void trim(string& s)
2 {
3 size_t p = s.find_first_not_of(" \t");
4 s.erase(0, p);
5
6 p = s.find_last_not_of(" \t");
7 if (string::npos != p)
8 s.erase(p+1);
9 }
Line 1: "s" is a reference parameter through which the original string is passed in and the result will be passed out.
Line 3: the string's built-in function find_first_not_of() returns the position of the first character which is not in the list of white spaces (' ' or '\t'). Since we are searching from the first character -- position 0, the result is also the number of leading white spaces.
Line 4: erase "p" characters from the beginning of the string, i.e. the leading white spaces. If there is no non-white-space character, line 3 will return string::npos. s.erase(0, string::npos) will then erase the whole string.
Line 6: the string's built-in function find_last_not_of() returns the position of the last character which is not a white space.
Line 7: if there is not trailing white spaces, line 6 returns string::npos. Therefore, our job is done.
Line 8: Otherwise, erase the trailing white spaces which starts from the next character to "p".
To test it, run this:
#include <string>
#include <iostream>
using namespace std;
void trim(string& s)
{
size_t p = s.find_first_not_of(" \t");
s.erase(0, p);
p = s.find_last_not_of(" \t");
if (string::npos != p)
s.erase(p+1);
}
int main()
{
string a = " a ";
string b = "";
string c = " ";
string d = " \t ";
trim(a);
trim(b);
trim(c);
trim(d);
cout << ":" << a
<< ":" << b
<< ":" << c
<< ":" << d
<< ":" << endl;
return 0;
}
2 comments:
Now C++11 is here, there are more compact ways to do this with lambdas. Assuming you want to strip both end of the string:
static inline string <rim(string &s)
{
s.erase(s.begin(),find_if_not(s.begin(),s.end(),[](int c){return isspace(c);}));
return s;
}
static inline string &rtrim(string &s)
{ s.erase(find_if_not(s.rbegin(),s.rend(),[](int c){return isspace(c);}).base(), s.end());
return s;
}
static inline string trim(const string &s)
{
string t=s;
return ltrim(rtrim(t));
}
Note ltrim() and rtrim() return references. They are destructive.
Detailed, thorough, really well explained, easy to follow your logic. Your line by line comments are quite helpful. Nicely done!
Post a Comment