#include <string>
#include <vector>
using namespace std;
// trim from start
std::string <rim(std::string &s) {
string::size_type n = s.find_first_not_of(" \r\n\t");
if (n != string::npos)
{
s.erase(0, n);
}
else
{
s = "";
}
return s;
}
// trim from end
std::string &rtrim(std::string &s) {
string::size_type n = s.find_last_not_of(" \r\n\t");
if (n != string::npos)
{
s.erase(n + 1, s.size() - n);
}
else
{
s = "";
}
return s;
}
std::string &trim(std::string &s) {
return ltrim(rtrim(s));
}
int stringsplit(const std::string& src, const std::string& separator, std::vector<std::string>& dest, bool btrim_all = true)
{
dest.clear();
string str = src;
if (trim(str).size() <= 0)
return 0;
// 首先找到第一个非分隔符的位置
auto it = str.find_first_not_of(separator, 0);
if (it == string::npos)
{
return 0;
}
// 去除左边所有的分隔符
str = str.substr(it);
string substring;
string::size_type start = 0, index = 0;
do
{
index = str.find_first_of(separator, start);
if (index != string::npos)
{
substring = str.substr(start, index - start);
if (btrim_all) trim(substring);
if (substring.size() > 0) dest.push_back(substring);
start = str.find_first_not_of(separator, index);
}
else
{
//the last token
substring = str.substr(start);
if (btrim_all) trim(substring);
if (substring.size() > 0) dest.push_back(substring);
break;
}
} while (start != string::npos);
return dest.size();
}
void printVector(const std::string& src, std::vector<std::string>& dest)
{
printf("src = %s\n", src.c_str());
printf("count = %d\n", dest.size());
for (auto it = dest.begin(); it != dest.end(); ++it)
{
printf("%s\n", it->c_str());
}
printf("-----------------------------\n");
}
int main()
{
std::string separator = ",";
std::string src;
std::vector<std::string> dest;
src = "ab,cd,ef";
stringsplit(src, separator, dest);
printVector(src, dest);
src = "ab";
stringsplit(src, separator, dest);
printVector(src, dest);
src = ",a b,, , cd ,ef,";
stringsplit(src, separator, dest);
printVector(src, dest);
src = ",";
stringsplit(src, separator, dest);
printVector(src, dest);
src = ",,,";
stringsplit(src, separator, dest);
printVector(src, dest);
src = "";
stringsplit(src, separator, dest);
printVector(src, dest);
src = " ";
stringsplit(src, separator, dest);
printVector(src, dest);
return 0;
}