C:当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, ",");

}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值