突然想到的一件事这是,之前是用stringstream来对那些东西切割的,只是空格分隔的,之后发现不能切割其他符号的字句(也可能是我水平有限),然后我发现strtok_s可以自定义分割符,于是我记录一下这个操作。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 1 << 10;
int main(void) {
string s;
getline(cin, s);
const char*c = " ,*";
char *p;
char *next = NULL;
string str[maxn];//用来存储分割后的单词
int i = 0;
p = strtok_s(const_cast<char*>(s.c_str()), c, &next);
while (p) {
str[i++].append(p);//存储用
p = strtok_s(NULL, c, &next);
}
for (auto iter : str)
cout << iter;
system("pause");
return 0;
}
ps:我用的时string数组的存储方式,当然还有好多更好用的存储方式,只是点到即可。每次调用strtok_s都是以一次分隔符结束,至于第一参数在第二次调用开始都用了NULL的解释我也不是很清楚,我的理解是里面有个静态变量,null相当于告诉函数这不是第一次调用,没有新传入值,只是继续进行下一个next 就好,在此再说一下形参:
strToken
这个参数用来存放需要分割的字符或者字符串整体
strDelimit
这个参数用来存放分隔符(例如:,.!@#$%%^&*() \t \n之类可以区别单词的符号)
context
这个参数用来存放被分割过的字符串
locale
这个参数用来储存使用的地址
虽说有4个参数,但是我们可控参数只有3个locale是不可控的