第一种,较为全能的实现方式, strtok 实现,其中也借助了 strcpy 所以要包含头文件 <cstring> ,代码如下
vector<string> split(string& str, string& delim){ vector<string> arr; // strtok 实现 if(str == "") return arr; char* strs = new char[str.length() + 1]; strcpy(strs, str.c_str()); char* delims = new char[delim.length() + 1]; strcpy(delims, delim.c_str()); char *p = strtok(strs, delims); while(p) { arr.push_back(p); p = strtok(NULL, delims); } return arr; }其中,str 为字符串,delim 为分隔符字符串,可以为多个分隔符。
具体思路: 通过 strcpy 函数把 string 转换为 char* ,然后调用 strtok 函数,strtok 函数原型为
char *strtok(char s[], const char *delim);具体含义为 strtok() 用来将字符串分割成一个个片段。参数 s 指向欲分割的字符串,参数 delim 则为分割字符串中包含的所有字符。当 strtok() 在参数 s 的字符串中发现参数 delim 中包含的分割字符时,则会将该字符改为 \0 字符。在第一次调用时,strtok() 必需给予参数 s 字符串,往后的调用则将参数 s 设置成 NULL 。每次调用成功则返回指向被分割出片段的指针。 其中,返回值为 char* 可直接转化为 string 。
第二种方式,借助 find 函数进行查找并分隔,这种方法主要适用于分隔符较少的情况,分隔符为一个,直接调用,分隔符为多个的时候,可以将原字符串的其他分隔符统一转化为一种,然后对这一种进行分隔。
vector<string> split(string& str, char delim) { vector<string> arr; // find 实现 // 最后加入一个分隔符,统一操作 str += delim; int ind = str.find_first_not_of(delim, 0); while(ind < str.size()) { int tem = str.find_first_of(delim, ind); arr.push_back(str.substr(ind, tem-ind)); ind = str.find_first_not_of(delim, tem); } return arr; }第三种方式,也是最简洁的方式,借助 stringstream ,需要包含头文件 <sstream>
其中,若分隔符为空格时,可直接采用 >> 进行分隔,若为其他字符,则需要借助 getline, 并需要判断得到的字符串是否为空串,若多个分隔符时,也可以将原字符串的其他分隔符统一转化为一种,例如空格,然后再分隔。
vector<string> split(string& str, char delim){ vector<string> arr; // stringstream 实现 string tem; stringstream ss(str); // 默认用空格作为分隔符 // while(ss >> tem) arr.push_back(tem); while(getline(ss, tem, delim)) if(tem != "")arr.push_back(tem); return arr; }