将有固定分隔符的字符串分解后存入到字符串数组
最近工作中有个需求将有固定分隔符的字符串分解后存入到字符串数组,需要用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);
}