@函数名称: strsplit。
函数原型: uint8_t **strsplit(uint8_t *str,uint8_t *Separator)。
函数功能: 将str字符串用特定分隔符Separator分隔为多个字符串。
函数返回: 分割后的子字符串列表指针。
注 意:存储分割后的子字符串列表的变量str_list是用动态内存分配函数malloc分配的,在使用完str_list后要及时释放其所占用的内存。
/*
******************************************************************************
* @file logan_string.h
* @brief 字符串处理函数
* @details 嵌入式常用字符串操作函数集合
* @author logan.lei
* @date 2021-10-18
* @version V0.1
* @copyright
******************************************************************************
* @attention None
* @par 修改日志
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td>2021/10/18 <td> V0.1 <td>logan.lei <td>初始版本
* </table>
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define uint8_t char
uint8_t **strsplit(uint8_t *str,uint8_t *Separator);
uint8_t numOfSubstr(uint8_t *str,uint8_t *Separator);
void strfreesplitp(uint8_t **spl,uint8_t len);
/**
* @brief 这个函数用来将给定的字符串str,按照给定的分隔符Separator进行分割,并返回分割后的子字符串。
* @note 应用实例:
* @param str 将要被分割的字符串。
* Separator 给定的分割符,暂时只支持一个字符的分割符。
* @return 返回分割后的子字符串的指针形式。
* @retval 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;
sub_str_len = numOfSubstr(str,Separator);
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;
}
/**
* @brief
* @note
* @param
* @return
* @retval
*/
uint8_t numOfSubstr(uint8_t *str,uint8_t *Separator)
{
uint8_t sub_str_len=0;
while(*str)
{
if(*str == *Separator)
sub_str_len++;
str++;
}
return sub_str_len+1;
}
/**
* @brief
* @note
* @param
* @return
* @retval
*/
void strfreesplitp(uint8_t **spl,uint8_t len)
{
uint8_t **sp = spl;
for(uint8_t i=0;i<len;i++)
{
free(*sp);
sp++;
}
free(spl);
}
/**
* @brief
* @note
* @param
* @return
* @retval
*/
void fun1(uint8_t *pData)
{
uint8_t i=0;
uint8_t sub_strNUM =0;
uint8_t *Separator=" ";
uint8_t **str_list=NULL,**str_list_buf=NULL;
sub_strNUM = numOfSubstr(pData,Separator);
str_list=strsplit(pData,Separator);
str_list_buf = str_list;
for(i=0;i<sub_strNUM;i++)
{
printf("str = %s, str_len=%d\n", *str_list_buf,strlen(*str_list_buf));
str_list_buf++;
}
strfreesplitp(str_list,sub_strNUM);
str_list = NULL;
}
void main()
{
uint8_t *pData = "1 2 3 4 5";
fun1(pData);
}
执行后的结果:
将字符串uint8_t *pData = "1 2 3 4 5"; 以空格为分隔符分割为8个子字符串。
str = 1, str_len=1
str = 2, str_len=1
str = 3, str_len=1
str = 4, str_len=1
str = 5, str_len=1