多级指针避免野指针

必须使用一入口一出口。多出口汇合后,释放资源。


#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//释放资源函数
void freemyp(char **myp,int count)
{
		int i=0;
		//如果没有申请内存
		if(myp==NULL)
		{
			return;
		}
		//释放后申请的内存
				for(i=0;i<count;i++)
				{
					free(myp[i]);
				}
		//释放先申请的内存
		if(myp!=NULL)
		{
			free(myp);
		}
}

int spitstring2(const char* buf1,char c,char ***myp,int *num)
{
	int ret=0;
	char *p=NULL,*ptem=NULL;
	char **mycopy=NULL;
	int tempnum=0;
	//判断传参是否正确,失败跳转
	if(buf1==NULL || num==NULL || myp==NULL)
	{
		ret=-1;
		printf("spitstring2(const char* buf1,char c,char ***myp,int *num) error:%d\n",ret);
		return ret;
	}
	p=buf1;
	ptem=buf1;
///
	//检索1确定申请的行数
	do{
		//匹配字符串数引号
		p=strchr(p,c);
		if(p!=NULL)
		{
			if(p-ptem>0)
			{
				tempnum++;
				//下一次检索条件生成
				ptem=p=p+1;
			}
		}
		else
			break;
	}while(*p!='\0');

	*num=tempnum;
	//申请行数
	mycopy=(char**)malloc(tempnum*sizeof(char*));
	//失败跳转
	if(mycopy==NULL)
	{
		ret=-2;
		printf("spitstring2(const char* buf1,char c,int *num) malloc1 is error:%d!\n ",ret);
		goto END;
	}

/
	//重新指向指针位置
	p=buf1;
	ptem=buf1;
	tempnum=0;
	do{
		//匹配字符串挖串
		p=strchr(p,c);
		if(p!=NULL)
		{
			if(p-ptem>0)
			{
				mycopy[tempnum]=(char*)malloc(sizeof(char)*(p-ptem+1));
				if(mycopy[tempnum]==NULL)
				{
					ret=-3;
					printf("spitstring2(const char* buf1,char c,int *num) malloc2 is error:%d!\n ",ret);
					goto END;
				}
				//挖串
				strncpy(mycopy[tempnum],ptem,p-ptem);
				mycopy[tempnum][p-ptem]='\0';
				tempnum++;
				//下一次检索条件生成
				ptem=p=p+1;
			}
		}
		else
			break;
	}while(*p!='\0');

END:
	if(ret != 0)
	{
		freemyp(mycopy,*num);
	}
	else
	{
		*myp=mycopy;
	}
	return 0;
}

void main()
{
	int ret=0,i=0;
	char *s="abc,dfer,vgty,hyujnb,";
	//char *s=NULL;
	char ccmp=',';
	char **ps=NULL;
	int ncount;

	//挖串函数
	spitstring2(s,ccmp,&ps,&ncount);
	//打印字符串
	for(i=0;i<ncount;i++)
	{
		printf("%s\n",ps[i]);
	}
	//释放内存

	free(ps);
	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值