您的位置:首页 > 其它

字符串分割函数(不用库函数)

2016-03-23 13:49 447 查看
/*
一个字符串里面有n个ch字符,
一般能够把原字符串分割成n-1(字符在开始和结尾),
n(字符在开始或结尾)或n+1(字符在非开始和结尾)个
*/
char** strsplit(char const *str, char ch)
{
char **res;//存放结果
char const* str1 = &str[0];//由于要遍历两次,所以先记录第一个元素位置
int i = 0;//用于计算出现次数
while (*str != '\0')
{
if (*str == ch)
{
i++;
}
str++;
}//i为出现的次数
if (i == 0)
{
return NULL;
}
res = (char**)malloc(sizeof(char*)*(i + 1));//分配二维数组行数,都按n+1计算,如果字符出现在第一个则返回的第一行为空
int len = 0;//每一个字符的长度
char buf[100];//临时存储字符的数组
i = 0;
while (*str1 != '\0')
{
if (*str1 == ch)//若没有碰到相同字符则一直向buf里面放置,
{//如果碰到,则先分配空间,然后把buf放进里面,再加上\0
buf[len] = '\0';
res[i] = (char*)malloc(sizeof(char)*(len + 1));
int k = 0;
while (buf[k] != '\0')
{
res[i][k] = buf[k];
k++;
}
res[i][k] = '\0';
len = 0;
i++;
}
else
{
buf[len++] = *str1;
}
str1++;
}
res[i] = (char*)malloc(sizeof(char)*(len + 1));
int k = 0;
while (buf[k] != '\0')
{
res[i][k] = buf[k];
k++;
}
res[i][k] = '\0';
return res;
}


略显繁琐,不过能用。

补充一个线程不安全的库函数法:

char ori[] = "21123248299";
for (char * token = strtok(ori, "2"); token != NULL; token = strtok(NULL, "2"))
{
printf("%s\n", token);
}


方法简单,但是strtok函数是在静态区进行分割的函数,简单用用还行,尽量还是多用自己编写的函数吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: