现在的位置: 首页 > 综合 > 正文

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

2013年01月31日 ⁄ 综合 ⁄ 共 3528字 ⁄ 字号 评论关闭

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

 函数StringSplit(分割字符串到一个字符串数组中,其中该数组第0位为分割后字符串的个数)
 函数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;
}

 

http://hi.baidu.com/nivrrex/item/8f0c8f175a9ce5721009b5a1

抱歉!评论已关闭.