[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)

来源:互联网 发布:虚拟物理实验室软件 编辑:程序博客网 时间:2024/05/28 18:44
2008-11-8: 函数StringSplit(分割字符串到一个字符串数组中,其中该数组第0位为分割后字符串的个数)2008-11-10: 函数StringSplit_Struct(以定义一个新结构的方式来实现该函数)/*C代码如下*/#include <stdio.h>/*实现方案1*//*分割字符串到一个字符串数组中,其中该数组第一位为分割后的个数*/char** StringSplit(const char* string,const char* split){     char** result;     /*首先分配一个char*的内存,然后再动态分配剩下的内存*/     result = (char * * )malloc(sizeof(char *)*1);     memset(result,0,sizeof(char *)*1);     /*定义一个遍历用的指针和一个寻找位置用的指针*/     char* p = string;     char* pos = string;     /*无论是否存在该分割串,绝对都会分割到一个字符串*/     int count = 1;     while(*p != '\0')     {         char* temp;         char* tt;         /*查找该字符串*/         pos = strstr(p,split);         /*结果为0说明剩下的字符串中没有该字符了*/         if(pos == 0)         {           result = (char * * )realloc(result,sizeof(char *)*(count+2));           result[0] = count;           result[count] = p;           result[count+1] = NULL;           return result;         }         /*分配临时字符串空间*/         temp = (char * )malloc(sizeof(char)*(pos - p+1));         memset(temp,0,sizeof(char)*(pos - p+1));         /*设置头指针,以便赋值时使用*/         tt = temp;         while(p<=pos)         {           *temp++ = *p++;         }         /*将字符串结尾置零*/         *--temp = '\0';         result = (char * * )realloc(result,sizeof(char *)*(count+1));         result[0] = count;         result[count] = tt;         count++;         /*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/         p +=strlen(split)-1;     }     return result;}/*实现方案2*//*为方便计数定义的结构,字符串数组从0开始赋值*/typedef struct{     int number;        /*分割的字符串个数*/     char** string;        /*字符串数组*/}StringTab;/*分割字符串到一个字符串数组中*/StringTab StringSplit_Struct(const char* string,const char* split){     StringTab result;     /*首先分配一个char*的内存,然后再动态分配剩下的内存*/     result.string = (char * * )malloc(sizeof(char *)*1);     memset(result.string,0,sizeof(char *)*1);     /*无论是否存在该分割串,绝对都会分割到一个字符串*/     result.number = 0;     /*定义一个遍历用的指针和一个寻找位置用的指针*/     char* p = string;     char* pos = string;     while(*p != '\0')     {        char* temp;        char* tt;        /*查找该字符串*/        pos = strstr(p,split);        /*结果为0说明剩下的字符串中没有该字符了*/        if(pos == 0)        {          result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));          result.string[result.number] = p;          return result;        }        /*分配临时字符串空间*/        temp = (char * )malloc(sizeof(char)*(pos - p+1));        memset(temp,0,sizeof(char)*(pos - p+1));        /*设置头指针,以便赋值时使用*/        tt = temp;        while(p<=pos)        {          *temp++ = *p++;        }        /*将字符串结尾置零*/        *--temp = '\0';        result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));        result.string[result.number] = tt;        /*计数器加一*/        result.number++;        /*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/        p +=strlen(split)-1;     }     return result;}int main(){     /*进行测试*/     /*方案1测试*/     char** array;     array = StringSplit("a/aaa//哈aa","aaa");     int i ;     for(i=1;i<=(int)array[0];i++)     {         printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);     }         array = StringSplit("a/aa哈a//哈aa","哈");     for(i=1;i<=(int)array[0];i++)     {         printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);     }     /*方案2测试*/     StringTab array2;     array2 = StringSplit_Struct("a/aaa//哈aa","aaa");     for(i=0;i<=array2.number;i++)     {        printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);     }     array2 = StringSplit_Struct("a/aa哈a//哈aa","哈");     for(i=0;i<=array2.number;i++)     {        printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);     }     return 0;}