将有固定分隔符的字符串分解后存入到字符串数组(C语言)

将有固定分隔符的字符串分解后存入到字符串数组

最近工作中有个需求将有固定分隔符的字符串分解后存入到字符串数组,需要用C语言实现

/*******************************************************************
 *@function: string_to_string_list
 *
 *@param1 [IN]: src_str, 有固定分隔符的字符串
 *
 *@param2 [IN]: delimiter, 分隔符字符
 *
 *@param3 [OUT]: delimiter_count, 出参, 分隔符数量
 *
 *@param4 [OUT]: str_list, 出参,用于存放结果的二位字符串数组,
 *               使用完成后需要使用LB_FREE_ARRAY释放数组内存
 *
 *@return: 1 for ok, 0 for error
 *
 *@description: 将传入的有固定分隔符的字符串分解后存入到二维字符串数组
 *
 *******************************************************************/
int string_to_string_list(char *src_str, char delimiter, int *delimiter_count, char ***str_list)
{
    char *start = NULL;
    char* end = NULL;
    int count = 0;
    int ret = 0;

    if (src_str == NULL || delimiter_count == NULL || str_list == NULL)
    {
        printf("[%s:%d] param error...\n", __FUNCTION__, __LINE__);
        return ret;
    }

    start = src_str;
    while (*start != '\0')
    {
        if (*start == delimiter) // 统计数组元素的个数
        {
            count++;
        }
        start++;
    }

    count++;
    *str_list = (char **)memset(malloc(count * sizeof(char*)), 0, count*sizeof(char*));
    if (*str_list == NULL)
    {
        printf("[%s:%d] malloc failed...\n", __FUNCTION__, __LINE__);
        return ret;
    }

    *delimiter_count = count;
    count = 0;
    start = src_str;

    while (*start == ' ' || *start == '\t')  //过滤掉前面的空格
    {
        start++;
    }

    int size = 0;
    while (*start != '\0' && (end = strchr(start, delimiter)))
    {
        size = end - start + 1;
        (*str_list)[count] = (char *)memset(malloc(size * sizeof(char)), 0, size*sizeof(char));
        if ((*str_list)[count] != NULL)
        {
            strncpy((*str_list)[count], start, end - start);
            ret = 1;
        }
        else
        {
            printf("[%s:%d][Error] malloc failed...\n", __FUNCTION__, __LINE__);
            ret = 0;
            break;
        }

        count++;
        start = end + 1;
        while (*start == ' ' || *start == '\t') //过滤掉空格
        {
            start++;
        }
    }

    size = strlen(start) + 1;
    (*str_list)[count] = (char *)memset(malloc(size * sizeof(char)), 0, size*sizeof(char));
    if ((*str_list)[count] != NULL)
    {
        strncpy((*str_list)[count], start, strlen(start));
        ret = 1;
    }
    else
    {
        printf("[%s:%d][Error] malloc failed...\n", __FUNCTION__, __LINE__);
        ret = 0;
    }

    return ret;
}


void string_list_free(char **str_list, int list_size)
{
    int index = 0;

    if ((str_list != NULL) &&
        (list_size > 0))
    {
        while (index < list_size)
        {
            if (str_list[index] != NULL)
            {
                free(str_list[index]);
                str_list[index] = NULL;
            }
            index++;
        }
    }

    if (str_list != NULL)
    {
        free(str_list);
        str_list = NULL;
    }
}


void test_for_string_to_string_list()
{
    char *msg_info = "40_239_54_188_209_195";
    char **str_array = NULL;
    int size = 0;
    int i = 0;

    if (string_to_string_list(msg_info, '_', &size, &str_array) == 0)
    {  
        for (i = 0; i < size; i++)
        {
            if (str_array[i] != NULL)
            {
                printf("%s\n", str_array[i]);
            }
        }
    }

    string_list_free(str_array, size); 
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值