c++ 中字符串split函数

写这个只是用来记忆一下,时至今日才发现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行的代码,给跪了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值