复杂的指针获取字符串里的内容放入数组

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

/*
4. 有一个字符串符合以下特征 "abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
	a) 以逗号,隔开字串,字串数量不会超过10个,每个字串长度不会超过30
	b) 以逗号分隔字符串,并把结果传出
	c)参考库函数:strchr(), strncpy(), strcpy(), strlen()
*/

char ** getMem(int n)
{
	char **p = malloc(n * sizeof(char *)); //char *p[]
	if (p == NULL)
	{
		return NULL;
	}

	//每个元素的空间
	int i = 0;
	for (i = 0; i < n; i++)
	{
		p[i] = malloc(30 * sizeof(char)); //char a[30]
		if (p[i] == NULL)
		{
			return NULL;
		}
	}

	return p;

}

void getMemFree(char ***buf, int n)
{
	if (buf == NULL)
	{
		return;
	}

	char **tmp = *buf;
	int i = 0;

	for (i = 0; i < n; i++)
	{
		if (tmp[i] != NULL)
		{
			free(tmp[i]);
			tmp[i] = NULL;
		}
	}

	free(tmp);
	*buf = NULL;

}

/*
功能:把 "abcdef,acccd,eeee,aaaa,e3eeee,ssss,",以","分隔出字符串,分配放在二维数组buf中
参数:
	str:	原字符串,"abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
	c:	 	分隔标志:','
	buf: 	指针数组首元素地址,其空间在主调函数分配
	count:保存buf字符串的个数
返回值:
	成功:0
	失败:非0
*/
int spitString(const char *str, char c, char **buf, int *count)
{
	if (str == NULL || count == NULL)
	{
		return -1;
	}

	const char *start = str;
	char *p = NULL;
	int i = 0; //第几行

	do
	{
		//"abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
		p = strchr(start, c);
		if (p != NULL)
		{
			int len = p - start;
			if (len > 0)
			{
				strncpy(buf[i], start, len);
				//添加结束符
				*( *(buf+i) + len ) = '\0';

				i++;
			}
			start = p + 1;
		}
		else
		{
			strcpy(buf[i], start);
			i++;
			break;
		}


	} while (*start != 0);

	*count = i; //有多少行字符串

	return 0;
}

int main()
{
	char *p = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
	char **buf = getMem(10); //动态打造指针数组
	int n = 0;
	int ret = 0;

	ret = spitString(p, ',', buf, &n);
	if (ret != 0)
	{
		return ret;
	}

	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%s\n", buf[i]); //打印字符串
	}

	getMemFree(&buf, n); //释放空间


	printf("\n");
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值