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函数,通过防止存储在被标记化的字符串之外,并通过检查运行时约束。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值