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