第一种,分隔符为空格。
使用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);