用C语言来分割字符串

#include <stdio.h>
int main()
{
    char str1[10] = {0};
    char str2[10] = {0};
    char str3[10] = {0};
    sscanf("1,2,3#3,4#4,5","%[^#]#%[^#]#%[^#]", str1, str2,str3);
    printf("The split result is:\n%s\n%s\n%s\n",str1, str2,str3);
    return 0;
}


以下转自:http://hi.baidu.com/nivrrex/blog/item/180d5bb5f9e403c936d3ca2f.html

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

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;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值