java string.split()函数的c/c++两种实现——strtok_r及string.find()

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值