前面批判了strtok, 本文来说说strtok_r, 后者在linux中才有, 虽然可冲入且线程安全, 但也不是什么好东西, 因为会改变原串, 如下:
#include <string>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int Str2Vector(const string& str, vector<string> &v, const char *p)
{
v.clear();
char *q;
char *pTmp = strtok_r(const_cast<char *>(str.c_str()), p, &q);
while(NULL != pTmp)
{
v.push_back(pTmp);
pTmp = strtok_r(NULL, p, &q);
}
return v.size();
}
int main()
{
string s = "|ab|cd|efg|h|";
string t = s;
vector<string> v;
Str2Vector(s, v, "|");
for(vector<string>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << endl;
}
cout << s << endl;
cout << t << endl;
return 0;
}
结果还是出人意料的如下结果:
taoge@localhost Desktop> g++ main.cpp
taoge@localhost Desktop> ./a.out
ab
cd
efg
h
|abcdefgh
|abcdefgh
taoge@localhost Desktop>
看来, 也不是什么好鸟。