struct TrimFunctor
{
bool operator()(const char &ch)
{
if (ch == ' ' || ch == ' ')
{
return true;
}
return false;
}
};
template <class _TrimFunc = TrimFunctor>
string leftTrim(const char *cstr)
{
size_t length = strlen(cstr);
for (size_t i = 0; i < length; ++i)
{
if (!_TrimFunc()(cstr[i]))
{
return string(cstr + i, cstr + length);
}
}
return "";
};
template <class _TrimFunc = TrimFunctor>
string rightTrim(const char *cstr)
{
size_t length = strlen(cstr);
for (size_t i = length - 1; i >= 0; --i)
{
if (!_TrimFunc()(cstr[i]))
{
return string(cstr, cstr + i + 1);
}
}
return "";
}
template <class _TrimFunc = TrimFunctor>
string trim(const char *cstr)
{
return rightTrim<_TrimFunc>(leftTrim<_TrimFunc>(cstr).c_str());
}
typedef vector<string> Tokens;
template <class _TrimFunc = TrimFunctor>
Tokens split(const char *cstr, const char *sep, bool is_first_trim = true, bool is_trim_token = true)
{
int seplen = strlen(sep);
assert(seplen);
string str(cstr);
if (is_first_trim)
{
str.assign(trim(cstr));
}
string::size_type lpos = 0, rpos = 0;
Tokens tokens;
while (true)
{
string tmp;
if ((rpos = str.find(sep, lpos)) == string::npos)
{
tmp.assign(str.c_str() + lpos, str.c_str() + str.size());
if (is_trim_token)
{
tmp = trim(tmp.c_str());
}
tokens.push_back(tmp);
break;
}
else
{
tmp.assign(str.c_str() + lpos, str.c_str() + rpos);
if (is_trim_token)
{
tmp = trim(tmp.c_str());
}
tokens.push_back(tmp);
lpos = rpos + seplen;
}
}
return tokens;
}
C++ string leftTrim rightTrim Trim split
最新推荐文章于 2024-01-30 07:00:00 发布