//
// Created by wangxn on 2016/3/2.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char ** splitString(const char *, const char, int *); //函数声明
int main(void){
char * theStr = "abaaaa;ccccccc;ssssssssssss;12312412;dfhsdgfsd;hhhhhhhhhh"; //测试使用的
int size = 0; //分割之后的字符串数量值,在函数中赋值
char ** retVal = splitString(theStr, ';', &size); //调用函数,获取分割之后的多个字符串
if (retVal == NULL){
return;
}
char ** point = retVal;
int i;
for (i = 0; i < size; ++i) { //遍历,打印
printf("%s\n", *(point+i));
}
for (i = 0; i < size; ++i){ //遍历,释放
free(*(point + i));
}
free(point);
}
char ** splitString(const char * str, const char tag, int * returnSize){
if (str == NULL || tag == NULL || returnSize == NULL){
return NULL;
}
int length = strlen(str); //获取待分割字符串长度
char * point; //遍历字符串字符的指针
point = str;
int size = 1; //分割之后的数量
int i = 0;
while (point){ //循环遍历字符串,获取分割之后会产生多少个字符串
if (*point == '\0'){ //到达字符串结尾,结束循环
break;
}
if (tag == *point){ //在指定的分隔符处
if (i != 0 && i != length - 1){ //不是字符串第一个字符,也不是最后一个字符时,
size++;
}
}
i++;
point++;
}
*returnSize = size; //获取分割之后会产生多少个字符串的数量
char ** retVal = (char **)malloc(size * sizeof(char *)); //分配保存多个字符串的地址的一个空间
i = 0;
int index = 1;
//分配一个和原始字符串相同大小的空间,并复制原始字符串到这个空间中,返回其指针,
*retVal = point = strdup(str);
if(point == NULL){
return NULL;
}
char ** ctlRetVal = retVal;
while (point){
if (*point == '\0'){ //到达结尾处,跳出循环
break;
}
if (tag == *point){ //指针指向分割点
*point = '\0'; //将分割字符设置为'\0',作为分段标记
ctlRetVal++;
*ctlRetVal = point + 1; //将下一个指针位置传递给 待返回字符串指针数组
}
point++;
}
return retVal;
}
使用到的字符串函数有:
char * strdup(const char * s);
size_t strlen(const char * s);
内存控制的函数:
void * malloc(size_t size);
void free(void * ptr);