C语言字符串分割_01

@函数名称:  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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值