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;
}
16th July 2010 4 Comments Permalink

4 Comments

  1. st says:

    看不懂啊看不懂

  2. TimonWang says:

    小伙子,公司的东西最好要小心点,我们看到了无所谓,如果某些“高管”看到了就不好了。呵呵

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Statistical data collected by Statpress SEOlution (blogcraft).