使用过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);
    }
}