c语言入门:指针运用 (用逗号切割字符串)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**
 * 打印数组
 * @brief printfArray
 * @param array
 * @param size
 */
void printfArray(const char** array,int size){

    for(int i=0;i<size;i++){

        printf("%s\n",*(array+i));

    }


}
/**
 * 释放内存
 * @brief freeAll
 * @param array
 * @param size
 */
void freeAll(char*** array,int size){

    if(array==NULL)
        return;

    char** arr=*array;

    if(arr==NULL)
        return;

    for(int i=0;i<size;i++){

        free(arr[size]);
        arr[size]=NULL;
    }

    free(arr);
    arr=NULL;
    printf("free success!\n");
}

/**
 * 分割字符串
 * @brief split
 * @param str 被分割的字符串
 * @param c 分割字符
 * @param size 被分割后生成的数组长度
 * @return 分割好的数组
 */
char** split(const char* str,const char c,int* const size){


    if(str==NULL||c==NULL||size==NULL){

        printf("err:str==NULL||c==NULL||size==NULL\n");
        return NULL;

    }

    int flag=0;
    int arr_size=0;
    char *p=NULL;
    char *tempp=NULL;
    p=tempp=str;

    do{
        p=strchr(p,c);
        if(p!=NULL&&p>tempp){
            arr_size++;
            tempp=p=p+1;
        }else{
            arr_size++;
            break;
        }

    }while(*p!='\0');

    *size=arr_size;

    char** result=(char**)malloc(arr_size*sizeof(char*));

    if(result==NULL){

        return NULL;
    }


    /*重置指针*/
    p=tempp=str;
    arr_size=0;

    /*循环赋值*/
    do{

        p=strchr(p,c);

        if(p!=NULL&&p>tempp){

            int length=p-tempp+1;
            *(result+arr_size)=(char*)malloc(length);

            if(*(result+arr_size)==NULL){
                flag=-1;
                goto END;
            }

            strncpy(*(result+arr_size),tempp,length-1);
            strcat(*(result+arr_size),"\0");
            arr_size++;
            tempp=p=p+1;
        }else{
            int length= strlen(tempp);
            *(result+arr_size)=(char*)malloc(length);

            if(*(result+arr_size)==NULL){
                flag=-1;
                goto END;
            }
            strcpy(*(result+arr_size),tempp);
            arr_size++;
            break;
        }

    }while(*p!='\0');



END://出错 后 free;
    if(flag!=0)
    {
        freeAll(&result,arr_size);
    }
    return result;

}



int main(int argc, char *argv[])
{
    /*测试用例*/
    char* str="123,456,789,101112,131415,relikang,";
    int arr_size;
    char** result =split(str,',',&arr_size);
    printf("arr_size=%d\n",arr_size);
    printfArray(result,arr_size);
    freeAll(&result,arr_size);

    return 0;
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值