@函数名称:??strsplit。
函数原型:??uint8_t **strsplit(uint8_t *str,uint8_t *Separator)。
函数功能:? 将str字符串用特定分隔符Separator分隔为多个字符串。
函数返回:? 分割后的子字符串列表指针。
注? ? ? ?意:存储分割后的子字符串列表的变量str_list是用动态内存分配函数malloc分配的,在使用完str_list后要及时释放其所占用的内存。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define uint8_t char //单片机C语言环境下可直接用uint8_t类型
uint8_t **strsplit(uint8_t *str,uint8_t *Separator)
{
uint8_t *str_buf=strdup(str);
uint8_t **str_list=NULL;
uint8_t sub_str_len=0;
uint8_t *strsub_str_buf=NULL;
uint8_t **p=NULL;
while(*str)
{
if(*str == *Separator)
sub_str_len++;
str++;
}
sub_str_len++;
// printf("%d\n",sub_str_len);
str_list = (uint8_t **)malloc(sub_str_len * sizeof(uint8_t *));
p = str_list;
strsub_str_buf=strtok(str_buf,Separator);
for(uint8_t i=0;i<sub_str_len;i++){
// printf("word: %s\n",strsub_str_buf);
*p = strsub_str_buf;
p=p+1;
strsub_str_buf=strtok(NULL,Separator);
}
return str_list;
}
/*
内存释放
*/
void strfreesplitp(uint8_t **spl)
{
uint8_t **sp = spl;
while(*sp)
{
sp++;
free(*(sp-1));
}
free(spl);
}
int main()
{
uint8_t *str="1 234 5 6 7 8 9 0";
uint8_t *Separator=" ";
uint8_t **str_list=NULL;
str_list=strsplit(str,Separator);
while(*str_list)
{
printf("str = %s, str_len=%d\n", *str_list,strlen(*str_list));
str_list++;
}
strfreesplitp(str_list);
}
执行后的结果:
将字符串uint8_t *str="1 234 5 6 7 8 9 0"; 以空格为分隔符分割为8个子字符串。
str = 1, str_len=1
str = 234, str_len=3
str = 5, str_len=1
str = 6, str_len=1
str = 7, str_len=1
str = 8, str_len=1
str = 9, str_len=1
str = 0, str_len=1
|