1. 自己实现split()
void split(const char *s, vector<string> &strs, char delim = ' ') { if(s == nullptr) { return; } const char *head, *tail; head = tail = s; while(*head != '\0') { while(*head != '\0' && *head == delim) { head++; } tail = head; while(*tail != '\0' && *tail != delim) { tail++; } if(head != tail) { strs.push_back(string(head, tail)); head = tail; } else { break; } } }
将字符串s按照delim代表的字符分割,并且放入vector中。
搜索过程中在stackoverflow上,发现了另外两个简单明了的办法。
2. stringstream
int main() { string str= "I love world!"; string str_temp; stringstream ss; str>>ss; while(!ss.eof()) { ss>>str_temp; cout<<str_temp<<endl; } }
这个方法的局限性就是没法使用空格以外的字符进行分割字符串
3.istringstream
istringstream str(" this is a sentence"); string out; while (str >> out) { cout << out << endl; }
运行
this is a sentence
4. getline() 实现 split()
void split(const std::string &s, std::vector<std::string> &elems, char delim = ' ') { std::stringstream ss; ss.str(s); std::string item; while (std::getline(ss, item, delim)) { elems.push_back(item); } } int main() { string line = "asd fasdf fadf fa"; vector<string> strs; split(line, strs); for(auto &s: strs) { cout << s << endl; } return 0; }
getline函数,顾名思义,是用来获取一行数据的,不过它的第三个参数也可以修改成其他字符,这样就可以将其他字符作为行分割符使用。
不过这种实现的缺点就是,getline每遇到一个行分割符都会返回一次,所以对于分割符连续的情况就束手无策了。
例如:
string str= "dsadsad sdsadasd wwwww eeeee";
打印结果就是:
dsadsad sdsadasd wwwww eeeee