目标:写一个类似与java中string.split()的函数,用语c++中字符串的分割。发现c库中有strtok函数有近似的功能,但是不能直接得到所有结果。
最终代码:
头文件:
其中,必须包含iostream,不知道为什么。
#ifndef _STRINGSPLITER_H
#define _STRINGSPLITER_H
#include <vector>
#include <iostream>
using namespace std;
vector<string>* strSplit(string srcString, string delimiter);
#endif
源文件:
strtok()实现
#include "strSpliter.h"
vector<string>* strSplit(string srcString, string delimiter)
{
vector<string>* dstVec = new vector<string>;
int sizeSrcString = srcString.size();
char *src = new char[sizeSrcString + 1];
//convert string to char* not const char* for strtok_r()
const char* srcStr = srcString.c_str();
char *dst = src;
while((*dst++ = *srcStr++) != '\0');
*dst = '\0';
char* pOuter;
char* pch = strtok_r(src, delimiter.c_str(), &pOuter);
while(pch != NULL)
{
dstVec->push_back(pch);
pch = strtok_r(NULL, delimiter.c_str(), &pOuter);
}
return dstVec;
}
string.find()实现
vector<string>* strSplit(string srcString, string delimiter)
{
vector<string>* dstVec = new vector<string>;
string::size_type pos1, pos2;
pos2 = srcString.find(delimiter);
pos1 = 0;
while(string::npos != pos2)
{
dstVec->push_back(srcString.substr(pos1, pos2 - pos1));
pos1 = pos2 + 1;
pos2 = srcString.find(delimiter, pos1);
}
dstVec->push_back(srcString.substr(pos1));
return dstVec;
}
测试main函数
#include "strSpliter.h"
int main()
{
string srcString = "adf//a b c/d e f/g/h i//dae";
vector<string>* pVecCutted = strSplit(srcString, "/");
vector<string>::iterator itVecCutted = pVecCutted->begin();
while(itVecCutted != pVecCutted->end())
{
cout<<*itVecCutted<<endl;
itVecCutted++;
}
return 0;
}
两种方法的不同结果:
第一种:
adf
a b c
d e f
g
h i
dae
第二种:
adf
a b c
d e f
g
h i
dae
参考资料:
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
http://www.cppblog.com/yinquan/archive/2009/06/01/86411.html
http://bbs.chinaunix.net/viewthread.php?tid=1273349