c语言之多级指针理解二

通过字符分离的demo进行理解:

//释放内存空间
void FreeAllMemory(char*** toArry, int cnt){
	if (toArry == NULL)
		return;

	char** tmpArry = NULL;
	tmpArry = *toArry;
	for (int i = 0; i < cnt; i++){
		if (tmpArry[i] != NULL)
		{
			free(tmpArry[i]);
		}
	}
	if (tmpArry != NULL){
		free(tmpArry);
	}

	*toArry = NULL;


}

//输出数据
void PrintPData(char** str, int cnt){
	if (str == NULL)
		return;
	for (int i = 0; i < cnt; i++){
		printf_s("%s\n", *(str + i));
	}
}

#pragma warning(disable:4996)//屏蔽安全检测
//分离字符串
void SplitStrByStr(char* sources, char str, char*** toArry, int* line){
	//没有分配内存空间 直接返回 
	if (toArry == NULL){
		return;
	}
	//行数
	int tmpLine = 0;
	char** tmpArry = NULL; //用于存储分配的内存空间 也就是toArry指向的内存空间
	char* sourcesCp1 = NULL;
	char* sourcesCp2 = NULL;
	sourcesCp1 = sources;
	sourcesCp2 = sources;

	//查找需要分配的内存块个数 避免申请的内存空间没有用上 合理利用内存
	do{
		sourcesCp1 = strchr(sourcesCp1, str);
		if (sourcesCp1 != NULL){
			tmpLine++;
			sourcesCp1++;
			sourcesCp2 = sourcesCp1;
		}
	} while (*sourcesCp1 != '\0');
	//分配内存空间
	tmpArry = (char**)malloc(sizeof(char*)*tmpLine);
	if (tmpArry == NULL)
		return;

	sourcesCp1 = sources;
	sourcesCp2 = sources;
	tmpLine = 0;
	//分配具体数据的内存空间 合理利用空间
	do
	{
		sourcesCp1 = strchr(sourcesCp1, str);
		if (sourcesCp1 != NULL){
			//两个字符指针的间隔
			if (sourcesCp1 - sourcesCp2 > 0){
				int len = sourcesCp1 - sourcesCp2 + 1;
				tmpArry[tmpLine] = (char*)malloc(sizeof(char)*len);
				if (tmpArry[tmpLine] == NULL){
					FreeAllMemory(&tmpArry, tmpLine);
					return;
				}
				//拷贝数据
				strncpy(tmpArry[tmpLine], sourcesCp2, len - 1);
				tmpArry[tmpLine][sourcesCp1 - sourcesCp2] = '\0';
				tmpLine++;
				sourcesCp1++;
				sourcesCp2 = sourcesCp1;
			}
		}

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

	*line = tmpLine;
	*toArry = tmpArry;

}



void main(){
	int line = 0;
	char* pStr = "Rose_Girl1,Rose_Girl2,Rose_Girl3,Rose_Girl4,Rose_Girl5,";
	char tmpChar = ',';
	char** pArry = NULL;
	SplitStrByStr(pStr, tmpChar, &pArry, &line);
	PrintPData(pArry, line);
	
	system("pause");
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值