C++中的字符串split
使用过Java
, Python
或者go
这些语言然后切换到C++
的同学很可能遇到一个问题就是:为什么在C++
的string类里面为什么没有提供一个split
函数呢?
猜测可能有下面几个原因:
- split之后的结果存放在哪里呢?vector?但是string类中引入vector势必会造成string和vector耦合的过紧呢?
- 如果使用了STL中的容器,那么内存分配的问题是否也需要考虑呢?
所以就干脆不提供这个函数了?不过在项目中如果使用了boost或者qt的话,这些库里面倒是提供了这个函数。但是在日常的小代码片段中(比如在刷leetcode的时候),还是更倾向于自己动手写一个这样的函数。
1. 使用C-Runtime提供的函数strtok
strtok函数线程不安全,可以使用strtok_r替代。
#include <string.h>
#include <stdio.h>
int main(){
char s[] = "Golden Global View,disk * desk";
const char *d = " ,*";
char *p;
p = strtok(s,d);
while(p){
printf("%s\n",p);
p=strtok(NULL,d);
}
return 0;
}
2. 使用string中的find函数
void split(const string &s, vector<string>& tokens, const string& delimiters = " ")
{
string::size_type lastPos = s.find_first_not_of(delimiters, 0);
string::size_type pos = s.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos)
{
//tokens.push_back(s.substr(lastPos, pos - lastPos));
tokens.emplace_back(s.substr(lastPos, pos - lastPos)); // C++11
lastPos = s.find_first_not_of(delimiters, pos);
pos = s.find_first_of(delimiters, lastPos);
}
}
- 原文作者:Binean
- 原文链接:https://bzhou830.github.io/post/20200205CppSplit/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。