C:当strtok遇上连续分割符

文章介绍了一个C语言函数str_replacenull,该函数用于处理具有连续分隔符的字符串,以便于使用strtok进行后续分割。在物联网项目中遇到此类问题时,通过预先在连续分隔符之间插入字符,可以避免strtok的限制。使用方法包括调用str_replacenull处理字符串,然后用strtok进行分词处理。注意,原始字符串缓冲区需要足够大,且该函数未进行安全检查。
部署运行你感兴趣的模型镜像

strtok在字符串处理上灵活高效,但分割字符的同时也更改了输入字符串,即在分割符处更改为 '\0',这样,对于连续分割符的字符串,就显得无能为力了。

最近在做一个物联网项目时,正好碰到需要处理类似的字符串,如:

+PARAMS:0,2,,,,,,"domain",,1

直接用strtok解析当然是直接出错,自己写个strtok不如写个预处理字符串函数来得快,预处理就是先将字符串处理成strtok认可的,在分割符中加个字符或空格,这样就实现声东击西的效果,二话不说先上代码:

// ----------------------------------------------------------------------------------------------------
// @description : This Function insert a char while string with continuous spliter, to fix strtok bug
// @arguments  : a is a ANSI string
// @return     : insert chars count
// @attention	 : char *a should keep enough buffer for expand string!
// ----------------------------------------------------------------------------------------------------
uint16_t str_replacenull(char *a, char spliter, char insert)
{
	uint16_t len = strlen(a);
	signed short i, k;
	uint16_t find=0;

	if(len<2) return 0;
	//scan current string
	for(i = 0; i<len-1; i++){
		if((a[i]==spliter) && (a[i+1]==spliter) ){
			//calc how many pair be found
			find++;
		}
	}

	if(find){
		k = len + find;		// k is new size
		a[k--] = 0;				// add \0
		for(i=len-1; i>0; i--)
		{
			//scan reverse
			if((a[i]==spliter) && (a[i-1]==spliter)){
				//find, then insert
				a[k--] = a[i];
				a[k--] = insert;
			}else{
				a[k--] = a[i];
			}
		}
	}
	return find;
}

使用方法就比较简单了,先加工一下要处理的字符串:

str_replacenull(str, ',',' ');

token = strtok(str, ",");

while(token != NULL){

//处理代码 此处略去任意字 

 token = strtok(NULL, ",");

}

严重注意:字符串保存的缓冲需要足够,本函数没有对输入字符串做安全管理,实际使用可以自行根据情况判断异常。

希望本文能给读者有所帮助。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值