Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4218450
  • 博文数量: 291
  • 博客积分: 8003
  • 博客等级: 大校
  • 技术积分: 4275
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-30 18:28
文章分类

全部博文(291)

文章存档

2017年(1)

2013年(47)

2012年(115)

2011年(121)

2010年(7)

分类: C/C++

2011-05-30 10:02:38

下面的代码是我写的一个分割字符串的代码,可以按照字符或者字符串分割
  1. //gcc split.c -o split
  2. /*
  3.  * 系统环境:Linux 或者windows
  4.  * 编译: gcc 或者vc++ 6.0
  5.  * 运行: ./split
  6.  * ----------------------------------------------------------------------------------------------------
  7.  * Copyright (c) 2011 by yifangyou
  8.  * All rights reserved
  9.  * ----------------------------------------------------------------------------------------------------
  10.  * 实现根据分隔符分隔字符串
  11.  *----------------------------------------------------------------------------------------------------
  12.  */

  13. #include<stdlib.h>
  14. #include<stdio.h>
  15. #include<string.h>
  16. /*
  17.  * ----------------------------------------------------------------------------------------------------
  18.  * 实现根据分隔符分隔字符串
  19.  * @param src:要分隔的字符串
  20.  * @param delim:分隔符
  21.  * @return 若是src或者delim为空时:返回一个字符串数组指针,以空字符串结尾,
  22.            若是无法申请内存:返回NULL,
  23.            分隔正常:返回一个字符串数组指针,以空字符串结尾
  24.  *----------------------------------------------------------------------------------------------------
  25.  */
  26. char **split(const char *src,const char *delim);
  27. int main()
  28. {
  29.   char str[]=" ab cd e fghi kn ";
  30.   char *delim=" "; //分隔符
  31.   char **result=NULL; //定义一个字符串数组指针
  32.   char **p=NULL;
  33.   result=split(str,delim);
  34.   p=result;
  35.   while(*p[0]){ //为空字符串时退出循环
  36.         printf("[%s]\n",*p);
  37.         free(*p); //释放字符串
  38.         p++;
  39.   }
  40.   free(*p);
  41.   free(result);
  42. }


  43. char **split(const char *src,const char *delim)
  44. {
  45.   
  46.   int size_char_p=sizeof(char*);
  47.   char **result=(char**)malloc(size_char_p);
  48.   char **ptmp=NULL; //用来记录新扩大的内存地址
  49.   char *src_copy;
  50.   int index=0; //申请的字符串指针索引
  51.   int result_size=1; //申请的字符串指针个数
  52.   int i=0;
  53.   char *p;
  54.   if(src==NULL||delim==NULL){
  55.     *result=strdup("");
  56.     return result;
  57.   }
  58.   //备份源字符串
  59.   src_copy=strdup(src);
  60.   //开始分隔第一个字符串
  61.   p=strtok(src_copy,delim);
  62.   //全部为空,或者空格
  63.   if(p==NULL||strlen(p)==0)
  64.   {
  65.     //释放备份
  66.     free(src_copy);
  67.     *result=strdup("");
  68.     return result;
  69.   }
  70.   //重新申请字符串指针空间
  71.   ptmp=(char**)realloc(result,(++result_size)*size_char_p);
  72.   if(ptmp==NULL){
  73.     printf("cannot realloc\n");
  74.     free(result);
  75.     return NULL;
  76.   }
  77.   result=ptmp;
  78.   *result=strdup(p);
  79.   index++;
  80.   //重新申请字符串指针的空间
  81.   while((p=strtok(NULL,delim)))
  82.   {
  83.     if(*p=='\0'){
  84.        continue;
  85.     }
  86.     //重新申请字符串指针
  87.     ptmp=(char**)realloc(result,(++result_size)*size_char_p);
  88.     if(ptmp==NULL){
  89.       printf("cannot realloc\n");
  90.       //无法申请内存,则释放申请的空间
  91.       for(i=0;i<result_size;i++){
  92.         free(result[i]);
  93.       }
  94.       free(result);
  95.       return NULL;
  96.      }
  97.     result=ptmp;
  98.     result[index]=strdup(p);
  99.     index++;

  100.    }
  101.    //释放备份字符串
  102.    free(src_copy);
  103.    //把最后一个置为空
  104.    result[index]=strdup("");
  105.    return result;
  106. }
阅读(2128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~