我是靠谱客的博主 执着魔镜,最近开发中收集的这篇文章主要介绍C/C++ 分隔字符串函数split(自定义),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码如下:

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(自定义)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部