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

94 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

/*******************************************************************

*@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); 

}