C++的字符串分割函数
定义一个数据结构,其中成员有int len, char* internal_buf, char** strings。其中len是被分割后的字符串的个数,internal_buf用于保存原字符串。char** strings是字符串指针(或者你可以看做是指向字符数组的字符串指针,指针指向的类型是字符串,而不是单一的字符,char*strings[]),每个字符串指针用于保存被分割后的每个字符串的首地址。
#define STRING_TERMINATER '\0'
/*必须用完后调用free_sc_exlode_t释放内存,否则内存泄露*/
typedef struct sc_exlode_struct
{
char** strings;
int len;
char* internal_buf;
} sc_exlode_t;
void free_sc_exlode_t(sc_exlode_t *string_array)
{
if(NULL == string_array)
{
return;
}
free(string_array->internal_buf);
free(string_array->strings);
free(string_array);
}
void split_string(char delimiter, char *string ,sc_exlode_t *string_array)
{
int count = 1;
char *pchar, **ptr;
if ( NULL != string_array)
{
memset(string_array, 0, sizeof(sc_exlode_t));
}
if(NULL == string || NULL == string_array)
{
return;
}
string_array->internal_buf = malloc(strlen(string) + 1);
strcpy(string_array->internal_buf,string);
if(NULL == string_array->internal_buf)
{
return;
}
pchar = string;
while(STRING_TERMINATER != *pchar) //计算原字符串可以分割成的字符串个数
{
if (delimiter == *pchar)
{
count++;
}
pchar++;
}
string_array->strings = (char**)malloc(count*sizeof(char*));
if(NULL == string_array->strings)
{
return;
}
string_array->len = count;
ptr = string_array->strings;
*ptr = string_array->internal_buf;
pchar = string_array->internal_buf;
while(STRING_TERMINATER != *pchar)
{
if (delimiter == *pchar) //遇到指定字符时走此分支
{
ptr++;
*ptr = pchar+1;
*pchar = STRING_TERMINATER;
pchar++;
//每个ptr所指向的字符串末尾应该为'\0',
//这样才能结束,所以将';'置为 '\0',
//并让下一个字符串的首个字符地址,
//即*ptr,指向‘;’后面的新字符串
//的首地址。
}
}
int main(void)
{
sc_exlode_t *string_array = malloc(sizeof(sc_exlode_t));
char *ip_range = "10.11.111.0;192.168.0.1;192.168.0.101";
split_string(';', ip_range, string_array);
printf("The spilited result: \n");
for(int i=0;ilen;i++)
{
printf("%s\n",string_array->strings[i]);
}
free_sc_exlode_t(string_array);
return 0;
}
管用!
看不懂啊看不懂
大哥啊,你最近跑哪去了啊,也不回个下沙~
现在在下沙了没啊?
小伙子,公司的东西最好要小心点,我们看到了无所谓,如果某些“高管”看到了就不好了。呵呵