目标:写一个类似与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