最后更新于 .

在python,c#等语言中,string都是默认提供split这个函数的,C++里面却没有默认实现,但又经常会用到,所以就简单实现了一个:

int SplitString(const string &srcStr,const string &splitStr,vector<string> &destVec)
{
    if(srcStr.size()==0)
    {   
        return 0;
    }   
    size_t oldPos,newPos;
    oldPos=0;
    newPos=0;
    string tempData;
    while(1)
    {   
        newPos=srcStr.find(splitStr,oldPos);
        if(newPos!=string::npos)
        {   
            tempData = srcStr.substr(oldPos,newPos-oldPos);
            destVec.push_back(tempData);
            oldPos=newPos+splitStr.size();
        }   
        else if(oldPos<=srcStr.size())
        {   
            tempData= srcStr.substr(oldPos);
            destVec.push_back(tempData);
            break;
        }   
        else
        {   
            break;
        }   
    }   
    return 0;
}

简单使用代码如下:

string src = ",,w,,ai,,,nio,,";
string splitStr = ",,";
vector<string> destVec;

SplitString(src,splitStr,destVec);
for(vector<string>::iterator it = destVec.begin();it!=destVec.end();++it)
{
    cout<<*it<<endl;
}

输出为:

w
ai
,nio

当然,一般split我们还是使用字符分割比较多。
另外也说一个问题,stl里面string的find和rfind方法是可以查找字符串的,但是find_last_of和find_first_of只能查找字符,即使传入的参数是字符串,查找的也是字符。

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. ww

    ww on #

    也可以考虑用下面这个:
    strtok的介绍
    功 能: 查找由在第二个串中指定的分界符分隔开的单词
    用 法: char *strtok(char *str1, char *str2);
    #include ;
    #include ;

    int main(void)
    {
    char input[16] = "abc,d";
    char *p;

    strtok places a NULL terminator
    in front of the token, if found
    p = strtok(input, ",");
    if (p) printf("%s\n", p);

    A second call to strtok using a NULL
    as the first parameter returns a pointer
    to the character following the token
    p = strtok(NULL, ",");
    if (p) printf("%s\n", p);
    return 0;
    }

    Reply

    1. Terrence

      Terrence on #

      同意~
      用strtok封装一个split会少写些代码,说不定速度还会快些。

      Reply

    2. Dante

      Dante on #

      The strtok() function uses a static buffer while parsing, so it's not thread safe. Use strtok_r() if this matters to you.

      这是man里的说明哦,如果用strtok_r可能的确更快一些~

      Reply

      1. ww

        ww on #

        汗一个, 刚知道man还有这个功能, 学习了

        Reply

  2. hwywhywl

    hwywhywl on #

    请教下博主,vimscript中如何获得当前打开文件的文件类型。

    Reply

    1. Dante

      Dante on #

      &ft 就是。
      可以执行一下
      :echo &ft
      试试。

      Reply

  3. hwywhywl

    hwywhywl on #

    嗯,谢谢博主,看了博主那篇《Vim在源代码中自动添加作者信息》,对这篇的vimscript做了一下修改,支持对pyton文件得注释。

    Reply

    1. Dante

      Dante on #

      哈,举一反三,加油~

      Reply

  4. 熊猫

    熊猫 on #

    支持博主!

    Reply

  5. sw

    sw on #

    split代价有点大的说。所以C++不提供。另外split和正则配合才是最完美的。

    Reply

    1. Dante

      Dante on #

      呃。。。即使效率低下,提供一个现成的也好呀。。。

      Reply

  6. 壮壮

    壮壮 on #

    strsep 也不错 这边有实现的代码
    http://www.koders.com/cpp/fid447A740B67AF498AF5C189E4BAA97F441567A25C.aspx

    Reply

发表评论