C提高_day03_两个辅助指针变量挖字符串(强化4)

本文详细介绍了使用C语言进行字符串处理的高级技巧,包括自定义内存管理函数FreeMem,实现字符串解析算法splitString4。通过优化内存分配与释放,提高程序效率,特别适用于处理大量数据或复杂字符串结构的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//两个辅助指针变量挖字符串, 的第三种内存模型

//指针做函数参数

void FreeMem(char **myp,int count)   //释放内存函数
{
    int i=0;
    if(myp == NULL)
    {
        return;
    }
    for(i=0;i<count;i++)
    {
        if(myp[i] != NULL)
        {
            free(myp[i]);
        }
    }
    if(myp != NULL)
    {
        free(myp);
    }
}

int spitString4(char *buf1,char c,char ***myp3,int *count)    //**pp二级指针做输入
{
    int ret =0;
    char *p=NULL, *pTmp = NULL;
    int    tmpcount = 0;
    int len;
    char **myp=NULL;

    //1 p和ptmp初始化
    p = buf1;
    pTmp = buf1;
    
    //第一遍求出count
    do
    {
        //2 检索符合条件的位置 p后移  形成差值 挖字符串
        p = strchr(p, c);
        if (p != NULL)
        {
            if (p-pTmp > 0)
            {
                tmpcount ++;
                //3重新 让p和ptmp达到下一次检索的条件
                pTmp = p = p + 1;
            }
        }
        else
        {
            break;
        }
    } while (*p!='\0');

    *count = tmpcount;

    //根据多少行精确分配内存
    myp=(char **)malloc(tmpcount * sizeof(char *));
    if(myp==NULL)
    {
        ret=-1;
        printf("func spitSpring4() err :%d malloc(tmpcount * sizeof(char *))",ret);
        goto END;
        //return -1;
    }

      /////////////////////////////////////////////////////////

    tmpcount=0;
    //1 p和ptmp初始化
    p = buf1;
    pTmp = buf1;
    
    do
    {
        //2 检索符合条件的位置 p后移  形成差值 挖字符串
        p = strchr(p, c);
        if (p != NULL)
        {
            if (p-pTmp > 0)
            {
                len=p-pTmp+1;
                myp[tmpcount]=(char *)malloc(len * sizeof(char));
                if(myp==NULL)
                {
                    //return -1;
                    ret=-1;
                     printf("func spitSpring4() err :%d malloc(tmpcount * sizeof(char *))",ret);
                    goto END;
                }
                strncpy(myp[tmpcount],pTmp,p-pTmp);
                myp[tmpcount][p-pTmp]='\0';
                tmpcount ++;
                //3重新 让p和ptmp达到下一次检索的条件
                pTmp = p = p + 1;
            }
        }
        else
        {
            break;
        }
    } while (*p!='\0');

END:
    if(ret != 0) //失败
    {
        FreeMem(myp,*count);
    }
    else
    {  
        *myp3 = myp;   //成功
    }        
    return ret;

}

int main()
{
    int i;
    int ret=0 ;
    char *p1="abcdef,aaa,eeeee,ffffff,a3a3a3,";
    char tmp=',';
    char **p=NULL;
    int nCount;

    ret=spitString4(p1,tmp,&p,&nCount);

    if(ret!=0)
    {
        printf("fun spiltString() err:%d \n",ret);
        return ret;
    }

    for(i=0;i<nCount;i++)
    {
        printf("%s \n",p[i]);
    }

    for(i=0;i<nCount;i++)
    {
        free(p[i]);
    }
    free(p);

    printf("%d \n",nCount);
    printf("hello...\n");
    system("pause");

}

转载于:https://www.cnblogs.com/zhesun/p/5008463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值