split string分隔字符串的3种实现

第一种,分隔符为空格。

使用istringstream来放置split之后的结果

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
    string s("Somewhere down the road");
    istringstream iss(s);

    do
    {
        string sub;
        iss >> sub;
        cout << "Substring: " << sub << endl;
    } while (iss);

}

第二种,分隔符为任意字符。

使用vector<string>来放置split之后的结果

/**
 *  切割字符串
 *  @param  original    [in]    需要切分的字符串
 *  @param  separator    [in]    分隔符
 *  @param  col_limit   [in]    最多解析的栏目数,0解析全部域
 *  @param  result  [out]   输出列表
 */
void split_string(const string& original, char separator, uint32_t col_limit, vector<string>* result)
{
    result->clear();
    size_t current_pos = 0, previous_pos = 0;
    uint32_t col_count = 0;
    while((current_pos = original.find(separator, previous_pos)) != string::npos && (col_limit == 0 || col_count < col_limit))
    {
        string part(original.substr(previous_pos, current_pos - previous_pos));
        result->push_back(part);
        previous_pos = current_pos + 1;
        col_count ++;
    }

    if(col_limit == 0 || col_count < col_limit)
    {
        string part(original.substr(previous_pos));
        result->push_back(part);
    }
}

第三种,分隔符为任意字符。

使用动态分配的内存来放置分隔后的结果,输出结果为一个数组的地址,数组的元素的类型为char*,即数组的每个元素是一个char*指针,指向的分割后的一小段的地址。

int split_string(char chr,char * src,uint32_t dstlimit,char ** dstlist,uint32_t * dstnum)
{
    char * ptab;
    ptab = src;
    *dstnum = 0;
    if(*ptab != 0)
      dstlist[(*dstnum)++] = ptab;
    ptab = strchr(ptab,chr);
    while(ptab != NULL && *dstnum < dstlimit){
        *ptab++ = '\0';
         dstlist[(*dstnum)++] = ptab;
         ptab=strchr(ptab,chr);
    }
    return 0;
 }

调用方式

char * field_list[33];
uint32_t feature_item_num;
uint32_t tmp_value;
struct in_addr tmp_addr;
split_string('\t',line,33,field_list,&feature_item_num);
if(feature_item_num != 33){
    ADR_WARNING("parse src line error! %s\n",field_list[0]);
    ADR_WARNING("unexpected number of splitting result! \n");
    return -1;
}
sscanf(field_list[18],"%d",&tmp_value);



你可能感兴趣的:(split string分隔字符串的3种实现)