c++ 中字符串split函数

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/t46414704152abc/article/details/83001775

写这个只是用来记忆一下,时至今日才发现c++ 的cstring类中已经有了字符串分split的函数,自己一直没有发现,羞愧难当,不过还好我是一个知耻后勇的人,既然今天发现了,那就记下来。
cstring中有一个strtok_s函数,它是一个分割字符串安全函数,其函数原型如下:

char *strtok_s( char *_String, const char *_Delimiter, char **_Context); 

// _String是带分割的字符串数组的首地址
// _Delimiter是分割字符串的字符集合,可以是单个字符,也可以是字符集合
// _Context是一个上下文字符指针的指针,每次对_String进行处理之后将剩余字符存储在_Context指向的位置中,保证线程安全

c++中一般存储字符串使用string类型,而strtok_s中需要的是char的变量,string中调用c_str()或者data()成员函数返回的是const char, 不能作为strtok_s中第一个变量的输入,怎么办呢?
我们只能使用const_cast,它能给一个变量增加const属性,也可以删除一个变量的const属性,于是我们可以使用const_cast去掉const属性。
示例代码如下。示例代码将str中的字符串,用空格进行分割后放入到strVec中。
这里需要说明的时,如果_Delimiter是字符集合的话,表示对_String进行分割,分割后的每一个子字符串都不含有_Delimiter中的任何一个字符。

	#include<cstring>
	#include<vector>
	#include<string>
	using namespace std;
	int main(){
		string str = "HELLO WORLD, I。。。 AM GOING TO A NEW REALM";
		vector<string> strVec;
		string delimiter = " ,。";
		char *context;
		char *p = strtok_s(const_cast<char*>(str.data()), delimiter.data(), &context);
		for (p; p!= nullptr; p = strtok_s(nullptr, delimiter.data(),&context))
		{
			char tmp[100];
			sprintf_s(tmp,100, "%s ",p);
			strVec.push_back(string(begin(tmp),end(tmp)));
		}
		for (auto&e : strVec)
			printf("%s \n", e.data());
		return 0;
	}

还是不得不感慨一下,c++和python相比,一个split,居然就要多写6行的代码,给跪了。

猜你喜欢

转载自blog.csdn.net/t46414704152abc/article/details/83001775