EazyChange

导航

 
/*
一个字符串里面有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函数是在静态区进行分割的函数,简单用用还行,尽量还是多用自己编写的函数吧。

posted on 2016-03-23 13:49  EazyChange  阅读(449)  评论(0编辑  收藏  举报