c分割字符串

 下面的代码是我写的一个分割字符串的代码,可以按照字符或者字符串分割

 

 
 
  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.  
  14. #include<stdlib.h> 
  15. #include<stdio.h> 
  16. #include<string.h> 
  17. /* 
  18.  * ---------------------------------------------------------------------------------------------------- 
  19.  * 实现根据分隔符分隔字符串 
  20.  * @param src:要分隔的字符串 
  21.  * @param delim:分隔符 
  22.  * @return 若是src或者delim为空时:返回一个字符串数组指针,以空字符串结尾, 
  23.            若是无法申请内存:返回NULL, 
  24.            分隔正常:返回一个字符串数组指针,以空字符串结尾 
  25.  *---------------------------------------------------------------------------------------------------- 
  26.  */ 
  27. char **split(const char *src,const char *delim); 
  28. int main() 
  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.  
  44. char **split(const char *src,const char *delim) 
  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.    //释放备份字符串 
  103.    free(src_copy); 
  104.    //把最后一个置为空 
  105.    result[index]=strdup(""); 
  106.    return result; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值