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, ",");
}
严重注意:字符串保存的缓冲需要足够,本函数没有对输入字符串做安全管理,实际使用可以自行根据情况判断异常。
希望本文能给读者有所帮助。