下面的代码是我写的一个分割字符串的代码,可以按照字符或者字符串分割
- //gcc split.c -o split
- /*
- * 系统环境:Linux 或者windows
- * 编译: gcc 或者vc++ 6.0
- * 运行: ./split
- * ----------------------------------------------------------------------------------------------------
- * Copyright (c) 2011 by yifangyou
- * All rights reserved
- * ----------------------------------------------------------------------------------------------------
- * 实现根据分隔符分隔字符串
- *----------------------------------------------------------------------------------------------------
- */
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- /*
- * ----------------------------------------------------------------------------------------------------
- * 实现根据分隔符分隔字符串
- * @param src:要分隔的字符串
- * @param delim:分隔符
- * @return 若是src或者delim为空时:返回一个字符串数组指针,以空字符串结尾,
- 若是无法申请内存:返回NULL,
- 分隔正常:返回一个字符串数组指针,以空字符串结尾
- *----------------------------------------------------------------------------------------------------
- */
- char **split(const char *src,const char *delim);
- int main()
- {
- char str[]=" ab cd e fghi kn ";
- char *delim=" "; //分隔符
- char **result=NULL; //定义一个字符串数组指针
- char **p=NULL;
- result=split(str,delim);
- p=result;
- while(*p[0]){ //为空字符串时退出循环
- printf("[%s]\n",*p);
- free(*p); //释放字符串
- p++;
- }
- free(*p);
- free(result);
- }
- char **split(const char *src,const char *delim)
- {
- int size_char_p=sizeof(char*);
- char **result=(char**)malloc(size_char_p);
- char **ptmp=NULL; //用来记录新扩大的内存地址
- char *src_copy;
- int index=0; //申请的字符串指针索引
- int result_size=1; //申请的字符串指针个数
- int i=0;
- char *p;
- if(src==NULL||delim==NULL){
- *result=strdup("");
- return result;
- }
- //备份源字符串
- src_copy=strdup(src);
- //开始分隔第一个字符串
- p=strtok(src_copy,delim);
- //全部为空,或者空格
- if(p==NULL||strlen(p)==0)
- {
- //释放备份
- free(src_copy);
- *result=strdup("");
- return result;
- }
- //重新申请字符串指针空间
- ptmp=(char**)realloc(result,(++result_size)*size_char_p);
- if(ptmp==NULL){
- printf("cannot realloc\n");
- free(result);
- return NULL;
- }
- result=ptmp;
- *result=strdup(p);
- index++;
- //重新申请字符串指针的空间
- while((p=strtok(NULL,delim)))
- {
- if(*p=='\0'){
- continue;
- }
- //重新申请字符串指针
- ptmp=(char**)realloc(result,(++result_size)*size_char_p);
- if(ptmp==NULL){
- printf("cannot realloc\n");
- //无法申请内存,则释放申请的空间
- for(i=0;i<result_size;i++){
- free(result[i]);
- }
- free(result);
- return NULL;
- }
- result=ptmp;
- result[index]=strdup(p);
- index++;
- }
- //释放备份字符串
- free(src_copy);
- //把最后一个置为空
- result[index]=strdup("");
- return result;
- }
本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/611393,如需转载请自行联系原作者