字符串分隔为二维数组,二级和三级指针的应用案例

目录

方案一

方案二

方案三

方案四

五方案


 

 

 

方案一

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

/*
有一个字符串符合以下特征(“abcdef,acccd,eeee,aaaa,e3eeee,ssss,”)
写两个函数(API),输出以下结果
第一个API
1)以逗号分隔字符串,形成二维数组,并把结果传出
2)把二维数组行数运算结果也传出
第二个API
1)以逗号分隔字符串,形成一个二级指针。
2)把一共拆分多少行字符串个数传出
要求:
1, 能正确表达功能的要求,定义出接口。
2, 正确实现接口和功能.
3, 编写正确的测试用例.
*/

int spitString(char *str, char ch, char array[][30], int *count)
{
	char *p = str;
	char *q = p;
	int temp_count = 0;
	int len = 0;

	if (str == NULL || array == NULL || count == NULL) {
		fprintf(stderr, "str == NULL || array == NULL || count == NULL\n");
		return -1;
	}

	//在一个字符串中 找到一个字符  找到了 返回第一个字符的地址, 失败返回NULL
	//strchr(母串, 字符)
	while ((p = strchr(p, ch)) != NULL) {
		//找到了
		strncpy(array[temp_count], q, p - q);
		array[temp_count][p - q] = '\0';

		temp_count++;
		p++;
		q = p;
		if (*p == '\0') {
			break;
		}
	}

	if (*q != '\0') {
		len = (str + strlen(str)) - q;
		strncpy(array[temp_count], q, len);
		array[temp_count][len] = '\0';
		temp_count++;
	}

	*count = temp_count;

	return 0;
}

int main(void)
{
	char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
	char array[10][30];
	int count = 0;
	int retn = 0;
	int i = 0;

	retn = spitString(str, ',', array, &count);
	if (retn < 0) {
		fprintf(stderr, "spitString er\n");
		return -1;
	}


	for (i = 0; i < count; i++) {
		printf("array[%d]:%s\n", i, array[i]);
	}




	return 0;
}

 

方案二

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


void free_mem(char ***array_p, int count)
{
	char **array = *array_p;
	int i = 0;

	if (array_p == NULL) {
		return;
	}

	void free(void*);

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

		free(array);
		*array_p = NULL;
	}
}


int spitString(char *str, char ch, char ***array_p, int *count)
{
	char * p = str;
	char * q = p;
	int temp_count = 0;
	char **array = NULL;
	int str_len = 0;
	int retn = 0;


	if (str == NULL || array_p == NULL || count == NULL) {
		fprintf(stderr, " (str == NULL || array_p == NULL || count == NULL)\n");
		return -1;
	}

	//1 求出 字符串中 拆分的个数
	while ((p = strchr(p, ch)) != NULL) {
		temp_count++;
		p++;
		q = p;
		if (*q == '\0') {
			break;
		}
	}
	if (*q != '\0') {
		temp_count++;
	}
	//此时temp_count 就是 子字符串的个数


	//2 根据个数开辟指针数组 在堆上
	array = (char**)malloc(sizeof(char*)* temp_count);
	if (array == NULL) {
		fprintf(stderr, "malloc  char **array error\n");
		retn = -1;
		goto END;
	}
	memset(array, 0, sizeof(char*)*temp_count);

	//3 拆分字符串, 为每一个指针开辟堆空间 拷贝字符串
	p = str;
	q = p;
	temp_count = 0;

	while ((p = strchr(p, ch)) != NULL) {
		//找到了
		str_len = p - q;
		array[temp_count] = (char*)malloc(sizeof(char)* (str_len+1));
		if (array[temp_count] == NULL) {
			fprintf(stderr, "malloc array[%d] error\n", temp_count);
			retn = -1;
			goto END;
		}
		strncpy(array[temp_count], q, str_len);
		array[temp_count][str_len] = '\0';

		temp_count++;
		p++;
		q = p;
		if (*p == '\0') {
			break;
		}
	}

	if (*q != '\0') {
		str_len = (str + strlen(str)) - q;
		array[temp_count] = (char*)malloc(sizeof(char)*(str_len + 1));
		if (array[temp_count] == NULL) {
			fprintf(stderr, "malloc array[%d] error\n", temp_count);
			retn = -1;
			goto END;
		}

		strncpy(array[temp_count], q, str_len);
		array[temp_count][str_len] = '\0';

		temp_count++;
	}

	if (array != NULL) {
		*array_p = array;
		*count = temp_count;
	}

	//释放内存的步骤
END:
	if (retn != 0) {
		//已经出现错误了
		free_mem(&array, temp_count);
	}
	return 0;
}


int main(void)
{
	char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
	char **array = NULL;
	int count = 0;
	int retn = 0;
	int i = 0;

	retn = spitString(str, ',', &array, &count);

	for (i = 0; i < count; i++) {
		printf("array[%d]: %s\n", i, array[i]);
	}

	free_mem(&array, count);

	if (array == NULL) {
		printf("array kong\n");
	}


	return 0;
}

 

 

方案三

 

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


char** mySpitString( char* buf1, char c, int* count)
{
	 char* p = NULL;
	 char* pTmp = NULL;
	int tmpcount = 0;
	char** myp = NULL;

	p = buf1;
	pTmp = buf1;


	// 第一次求出count
	do 
	{
		p = strchr(p, c);
		if (p != NULL)
		{
			if ( p - pTmp > 0 )
			{
				tmpcount++;
				pTmp = p = p + 1;
			}
		}
		else
		{
			break;
		}

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

	//根据多少行精确的分配 内存
	myp = (char**)malloc(tmpcount*sizeof(char*));

		if (myp == NULL)
		{
			return NULL;
		}

		tmpcount = 0;
		p = buf1;
		pTmp = buf1;

		do
		{
			p = strchr(p, c);
			if (p != NULL)
			{
				//检索符合条件的位置p后移, 形成差值,挖字符串
				if (p - pTmp > 0)
				{
					int len = p - pTmp +1;//分配‘\0’的空间
					myp[tmpcount] = (char*)malloc(len*sizeof(char));
					if (myp[tmpcount]== NULL) 
					{
						return NULL;
					}
					strncpy(myp[tmpcount], pTmp, p - pTmp);
					myp[tmpcount][p - pTmp] = '\0'; //把一行数据变成c风格的字符串
					//让p  ptmp达到下一次检索条件
					pTmp = p = p + 1;
					tmpcount++;

				}
			}
			else
			{
				break;
			}

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


		*count = tmpcount;
		return myp;
}




int main(void)
{
	char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";

	int ret = 0, k = 0;
	char cTem = ',';
	int nCount = 0;

	char** p = NULL;
	p = mySpitString(str, cTem, &nCount);
	if (p == NULL)
	{
		printf("error:%d\n", ret);
		return ret;
	}

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

	//free room
	for (size_t i = 0; i < nCount; i++)
	{
		free(p[i]);

	}
	free(p);

	system("pause");
	return 0;

}

方案四

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


char** mySpitString( char* buf1, char c, int* count)
{
	 char* p = NULL;
	 char* pTmp = NULL;
	int tmpcount = 0;
	char** myp = NULL;

	p = buf1;
	pTmp = buf1;


	// 第一次求出count
	do 
	{
		p = strchr(p, c);
		if (p != NULL)
		{
			if ( p - pTmp > 0 )
			{
				tmpcount++;
				pTmp = p = p + 1;
			}
		}
		else
		{
			break;
		}

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

	//根据多少行精确的分配 内存
	myp = (char**)malloc(tmpcount*sizeof(char*));

		if (myp == NULL)
		{
			return NULL;
		}

		tmpcount = 0;
		p = buf1;
		pTmp = buf1;

		do
		{
			p = strchr(p, c);
			if (p != NULL)
			{
				//检索符合条件的位置p后移, 形成差值,挖字符串
				if (p - pTmp > 0)
				{
					int len = p - pTmp +1;//分配‘\0’的空间
					myp[tmpcount] = (char*)malloc(len*sizeof(char));
					if (myp[tmpcount]== NULL) 
					{
						return NULL;
					}
					strncpy(myp[tmpcount], pTmp, p - pTmp);
					myp[tmpcount][p - pTmp] = '\0'; //把一行数据变成c风格的字符串
					//让p  ptmp达到下一次检索条件
					pTmp = p = p + 1;
					tmpcount++;

				}
			}
			else
			{
				break;
			}

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


		*count = tmpcount;
		return myp;
}
void FreeRoomP(char*** p, int count)
{

	int i = 0;
	char** myp = NULL;
	if (p == NULL)
	{
		return;
	}
	myp = *p;
    
    if(myp == NULL)
    {
        return;
    }
	for (; i < count; i++)
	{
		if (myp[i] != NULL)
		{
			free(myp[i]);
		}
	}

	if (myp != NULL)
	{
		free(myp);
	}
	*p = NULL; //把实参二级指针,修改为NULL
}

void FreeRoom(char** myp, int count)
{

	int i = 0;
	if (myp == NULL)
	{
		return ;
	}

	for (; i < count; i++)
	{
		if (myp[i] != NULL)
		{
			free(myp[i]);
		}
	}

	if (myp != NULL)
	{
		free(myp);
	}

}

char mySpitStr(char* buf1, char c, char*** myp3, int* count)
{
	char* p = NULL;
	char* pTmp = NULL;
	int tmpcount = 0;
	char** myp = NULL;
	int ret = 0;

	p = buf1;
	pTmp = buf1;


	// 第一次求出count
	do
	{
		p = strchr(p, c);
		if (p != NULL)
		{
			if (p - pTmp > 0)
			{
				tmpcount++;
				pTmp = p = p + 1;
			}
		}
		else
		{
			break;
		}

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

	//根据多少行精确的分配 内存
	myp = (char**)malloc(tmpcount*sizeof(char*));

	if (myp == NULL)
	{
		//如果这儿出错已分配 的内存要释放 
		ret = -2;
		printf("here error myp**malloc(tmpcount*sizeof(char*))\n");
		goto END;
		//return -2;
	}
	memset(myp, 0, tmpcount*sizeof(char*));

	tmpcount = 0;
	p = buf1;
	pTmp = buf1;

	do
	{
		p = strchr(p, c);
		if (p != NULL)
		{
			//检索符合条件的位置p后移, 形成差值,挖字符串
			if (p - pTmp > 0)
			{
				int len = p - pTmp + 1;//分配‘\0’的空间
				myp[tmpcount] = (char*)malloc(len*sizeof(char));
				if (myp[tmpcount] == NULL)
				{
					//如果这儿出错已分配 的内存要释放 
					ret = -2;
					printf("here error  (char*)malloc(len*sizeof(char)\n");
					goto END;
					//return -1;
				}
				strncpy(myp[tmpcount], pTmp, p - pTmp);
				myp[tmpcount][p - pTmp] = '\0'; //把一行数据变成c风格的字符串
												//让p  ptmp达到下一次检索条件
				pTmp = p = p + 1;
				tmpcount++;

			}
		}
		else
		{
			break;
		}

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

END:
	if (ret !=0)
	{
		//free room, 只要一个就可以了,其它可以注释了
		//free1
		FreeRoom(myp, *count);
		//free2
		FreeRoomP(&myp, *count);
		//free3
		int i = 0;
		if (myp == NULL)
		{
			return -3;
		}

		for (; i < tmpcount; i++)
		{
			if (myp[i] != NULL)
			{
				free(myp[i]);
			}
		}

		if (myp != NULL)
		{
			free(myp);
		}
	}
	else
	{
		*myp3 = myp; //suceess
	 *count = tmpcount;
	}

	return ret;
}



int main(void)
{
	char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
	int ret = 0, k = 0;
	char cTem = ',';
	int nCount = 0;

	char** p = NULL;
	//p = mySpitString(str, cTem, &nCount);
	//if (p == NULL)
	//{
	//	printf("error:%d\n", ret);
	//	return ret;
	//}
	//or
	 mySpitStr(str, cTem, &p, &nCount);//采用三级指针


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

	//free room
	for (size_t i = 0; i < nCount; i++)
	{
		free(p[i]);

	}
	free(p);



	system("pause");
	return 0;

}

五方案

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

#define IN
#define OUT


void free_mem(char ***array_p, int num) // char ****array = &p
{
	char **array = *array_p;
	int i = 0;

	if (array_p == NULL) {
		return;
	}

	if (array == NULL) {
		return;
	}

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

	free(array);

	*array_p = NULL;
}

int sort(IN char *array_1[], int num1,
	IN char(*array_2)[30], int num2,
	OUT char ***array_3_p, OUT int *num3_p)
{
	char **p= NULL;
	int num3 = 0;
	int retn = 0;
	int i = 0;
	int j = 0;
	int len = 0;
	char *temp_p = NULL;

	if (array_1 == NULL || array_2 == NULL || array_3_p == NULL || num3_p == NULL) {
		fprintf(stderr, "array_1 == NULL || array_2 == NULL || array_3_p == NULL || num3 == NULL\n");
		return -1;
	}

	num3 = num1 + num2; //这个是p3指针所需要第一次开辟的 指针的个数
	p = (char**)malloc(sizeof(char*)*num3);
	if (p == NULL) {
		fprintf(stderr, "malloc char**p3 error\n");
		retn = -1;
		goto END;
	}
	memset(p, 0, sizeof(char*)*num3);

	//array_1 copy p中
	for (i = 0; i < num1; i++) {
		len = strlen(array_1[i]);
		p[i] = (char*)malloc(sizeof(char)* (len + 1));
		memset(p[i], 0, sizeof(char)*(len + 1));
		strcpy(p[i], array_1[i]);
	}

	//array_2 copy p中
	for (j = 0; j < num2; j++, i++) {
		len = strlen(array_2[j]);
		p[i] = (char*)malloc(sizeof(char)*(len + 1));
		memset(p[i], 0, sizeof(char)*(len + 1));
		strcpy(p[i], array_2[j]);
	}

	for (i = 0; i < num3; i++) {
		printf("p[%d]:%s\n", i, p[i]);
	}
	//对 p 排序

	for (i = 0; i < num3; i++) {
		for (j = i; j < num3; j++) {
			if (strcmp(p[i], p[j]) > 0) {
				temp_p = p[i];
				p[i] = p[j];
				p[j] = temp_p;
			}
		}
	}
	printf("----\n");
	for (i = 0; i < num3; i++) {
		printf("p[%d]:%s\n", i, p[i]);
	}

	*array_3_p = p;
	*num3_p = num3;

END:
	if (retn != 0) {
		free_mem(&p, num3);
	}
	return 0;
}


int main(void)
{
	int ret = 0;

	char *p1[] = { "aa", "cccccc", "bbbbb" };
	char buf2[10][30] = { "111111", "3333", "2222" };
	char **p3 = NULL;

	int len1, len2,len3, i = 0;

	len1 = sizeof(p1) / sizeof(*p1);
	len2 = 3;

	sort(p1, len1, buf2, len2, &p3, &len3);


	free_mem(&p3, len3);

	if (p3 == NULL) {
		printf("free p3 succ\n");
	}




	return 0;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值