概述
代码如下:
void spilt(char *srcStr, const char* sep, std::vector<std::string> &vecStr)
{
if (srcStr == nullptr)
return;
//①复制字符串
int len = strlen(srcStr);
char *str = new char[len + 1];
strcpy_s(str, len + 1, srcStr);
char *p = nullptr;
char *nextStr = nullptr;
p = strtok_s(str, sep, &nextStr);
while (p)
{
if (p != nullptr)
{
std::string cc(p);
vecStr.push_back(cc);
p = strtok_s(nullptr, sep, &nextStr);
}
}
return;
}
解析1:代码中的标记①
添加字符串strcpy_s()的原因:避免strtok_s()的第一个参数如果传入的形参是一个常量指针,则会导致程序出现段错误,导致奔溃。
例如:1.char *srcStr= "ssss sss s sss ss"; //(常量类型)如果直接使用形参会导致程序奔溃 ,错误
指把后面常量的首地址给了srcStr.
2. char srcStr[] = "ssss sss s sss ss"; //正确
相当于char srcStr[18]; memcpy(srcStr,"ssss sss s sss ss",18);
每次执行到的时候都会把常量"ssss sss s sss ss"复制一遍,带引号的常量放在只读数据区域,不能进行修改,
而srcStr[18]是放在堆栈里面的数组,可以进行修改。
解析2:strtok_s()
原型:char * __cdecl strtok_s( char * _Str, const char * _Delim, char ** _Context);
参数说明:
_Str:这个参数用来存放需要分割的字符或者字符串整体(会被修改)
_Delim:这个参数用来存放分隔符(例如:,.!@#$%%^&*() t n之类可以区别单词的符号)
_Context:这个参数用来存放被分割过的字符串
注意
这个函数具有破坏性:它在字符串str的元素中写入' 0'字符。 特别是,字符串文字不能用作strtok的第一个参数。
每次调用strtok都会修改一个静态变量:不是线程安全的。
与大多数其他标记器不同,strtok中的分隔符对于每个后续标记都可能不同,甚至可能取决于先前标记的内容。
该strtok_s
函数不同于POSIX strtok_r函数,通过防止存储在被标记化的字符串之外,并通过检查运行时约束。
最后
以上就是执着魔镜为你收集整理的C/C++ 分隔字符串函数split(自定义)的全部内容,希望文章能够帮你解决C/C++ 分隔字符串函数split(自定义)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复