文章目录

  • 一、二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 )
  • 二、完整代码示例

一、二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 )


博客 【C 语言】二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 ) 中 , 使用 二维数组 , 接收字符串切割结果 ;

博客 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 ) 中 , 使用 自定义二级指针 , 接收字符串切割结果 ;

先分析出该 字符串中, 有多少个 逗号 字符 , 可以得到 二级指针 指向的 内存空间中 , 要存储多少 一级指针 , 也就是分析出有多少 行 , 然后在分析 每行 有多少列 , 即 为每个 一级指针 分配多少内存 ;

上述分配方式 , 能精准控制 内存 , 最大限度利用内存 ;

扫描 222 遍 ,

  • 第一遍扫描 , 求出有多少个 一级指针 , 并为其分配内存 ;
  • 第二次扫描 , 求出每个 一级指针 要分配多少内存 ;

第一次扫描 : 计算 要分割的字符串 个数 , 为其分配内存 ;

    // 第一次遍历 , 求出有多少行do{// 字符串中, 查找 字符 ','// 找到后 , 返回 逗号 第一次出现的指针p1 = strchr(p1, c);if (p1 != NULL){// 将 p1 指针 与 p2 指针之间的 字符拷贝出来// 这就是分割后的字符串if (p1 - p2 > 0){tmpcount ++;p1 = p2 = p1 + 1;}}else{// 如果 p1 为 NULL , 说明没有找到逗号字符 , 退出循环即可break;}} while (*p1 != '\0');// 得到分割的字符串个数*count = tmpcount;// 为 一级指针 分配内存p = (char **) malloc(tmpcount * sizeof(char *) );if (myp == NULL){return -1;}// 初始化分配的内存memset(p, 0, tmpcount * sizeof(char *));

第二次扫描 : 为每个 一级指针 分配对应的内存 , 并拷贝 分割后的 字符串 ;

    // 第二次遍历// p1 , p2 初始化p1 = str;p2 = str;tmpcount = 0;do{// 字符串中, 查找 字符 ','// 找到后 , 返回 逗号 第一次出现的指针p1 = strchr(p1, c);if (p1 != NULL){// 将 p1 指针 与 p2 指针之间的 字符拷贝出来// 这就是分割后的字符串if (p1 - p2 > 0){// 计算精准控制的 一级指针 指向的内存大小int len = p1 - p2 + 1;// 为 一级指针 分配内存p[tmpcount] = (char *) malloc(len * sizeof(char));if(p[tmpcount] == NULL){return -1;}// 将 p2 后的 p1 - p2 个字符// 拷贝到数组中strncpy(p[tmpcount], p2,  p1 - p2);// 实际的字符拷贝完成后 , 再将 '\0' 字符拷贝过去p[tmpcount][p1-p2]  = '\0';// 拷贝完成后 , 字符tmpcount ++;// p2 和 p1 都设置为 指向 逗号后面字符// 重新开始查找 逗号 并分割p2 = p1 = p1 + 1;}}else{// 如果 p1 为 NULL , 说明没有找到逗号字符 , 退出循环即可break;}} while (*p1 != '\0');// 通过间接赋值 设置 分割后的字符串 到 自定义二级指针*myp = p;

二、完整代码示例


完整代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*** @brief split_str 分割字符串* @param str 要分割的字符串* @param c 分割依据* @param p 将分割结果写入该二级指针内存* @param count 分割了多少份* @return*/
int split_str(const char *str, char c, char ***myp, int *count)
{// 用于接收 str 参数char *p1 = NULL, *p2 = NULL;// 临时变量int tmpcount = 0;// 自定义的二级指针char **p = NULL;// p1 , p2 初始化p1 = str;p2 = str;// 第一次遍历 , 求出有多少行do{// 字符串中, 查找 字符 ','// 找到后 , 返回 逗号 第一次出现的指针p1 = strchr(p1, c);if (p1 != NULL){// 将 p1 指针 与 p2 指针之间的 字符拷贝出来// 这就是分割后的字符串if (p1 - p2 > 0){tmpcount ++;p1 = p2 = p1 + 1;}}else{// 如果 p1 为 NULL , 说明没有找到逗号字符 , 退出循环即可break;}} while (*p1 != '\0');// 得到分割的字符串个数*count = tmpcount;// 为 一级指针 分配内存p = (char **) malloc(tmpcount * sizeof(char *) );if (myp == NULL){return -1;}// 初始化分配的内存//memset(p, 0, tmpcount * sizeof(char *));// 第二次遍历// p1 , p2 初始化p1 = str;p2 = str;tmpcount = 0;do{// 字符串中, 查找 字符 ','// 找到后 , 返回 逗号 第一次出现的指针p1 = strchr(p1, c);if (p1 != NULL){// 将 p1 指针 与 p2 指针之间的 字符拷贝出来// 这就是分割后的字符串if (p1 - p2 > 0){// 计算精准控制的 一级指针 指向的内存大小int len = p1 - p2 + 1;// 为 一级指针 分配内存p[tmpcount] = (char *) malloc(len * sizeof(char));if(p[tmpcount] == NULL){return -1;}// 将 p2 后的 p1 - p2 个字符// 拷贝到数组中strncpy(p[tmpcount], p2,  p1 - p2);// 实际的字符拷贝完成后 , 再将 '\0' 字符拷贝过去p[tmpcount][p1-p2]  = '\0';// 拷贝完成后 , 字符tmpcount ++;// p2 和 p1 都设置为 指向 逗号后面字符// 重新开始查找 逗号 并分割p2 = p1 = p1 + 1;}}else{// 如果 p1 为 NULL , 说明没有找到逗号字符 , 退出循环即可break;}} while (*p1 != '\0');// 通过间接赋值 设置 分割后的字符串 到 自定义二级指针*myp = p;return 0;
}/*** @brief 主函数入口* @return*/
int main()
{// 存放返回值int ret = 0;// 字符串分割的份数int count = 4;// 按照逗号分割char split = ',';// 字符串char *str = "12,ab,345,";// 循环控制变量int i = 0;// 存放分割结果, 此处自定义 二级指针 内存结构char **p = NULL;// 分割字符串ret = split_str(str, split, &p, &count);// split_str 方法执行失败if(ret != 0){printf("split error!\n");return ret;}// 打印分割结果for(i = 0; i < count; i++){printf("%s\n", p[i]);}// 释放内存// 先释放 num 个 一级指针for(i = 0; i < count; i++){if(p[i] != NULL){free(p[i]);p[i] = NULL;}}// 再释放 二级指针if(p != NULL){free(p);}// 二维指针 置空p = NULL;// 命令行不要退出system("pause");return 0;
}

执行结果 :

【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )相关推荐

  1. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 ) 上一篇博客 [C 语言]二级指针案例 ( 字符串切割 | 返回 二维数组 作为结 ...

  2. 【C 语言】二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )

    文章目录 一.二级指针案例 ( 返回二维数组 ) 二.完整代码示例 一.二级指针案例 ( 返回二维数组 ) 将 "12,ab,345," 字符串 以 逗号 "," ...

  3. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  4. C语言函数怎么像python那样返回多个值?(三种方法:1、设置全局变量 2、传递指针 3、使用结构体返回不同类型的数据)

    引用文章:c语言函数可不可以返回多个值 文章目录 方法一:设置全局变量 例如:利用一个函数求出正方形的周长和面积. 方法二:使用数组名或指针作为函数的形参 实例2:编写函数求一维整形数组的最大值与最小 ...

  5. 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )

    文章目录 前言 一.指针数组 二.二维数组 三.自定义二维指针内存 前言 绘制如下 333 种二级指针的内存模型 : // I. 指针数组 char *p1 []= {"12", ...

  6. c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...

    Go返回int64类型字段超出javascript Number范围的解决方法 最近在项目中,一个go服务给前端提供了一个接口,返回json格式数据,其中Int64字段会超出javascript Nu ...

  7. c语言填空题删除字符串k右边,计算机二级C语言上机模拟试题及解题思路

    计算机二级C语言上机模拟试题及解题思路 随着2017年上半年计算机等级考试的临近,百分网小编为大家整理了2017计算机二级C语言上机模拟试题及解题思路,更多计算机等级考试信息请关注应届毕业生考试网. ...

  8. 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...

  9. 【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )

    文章目录 前言 一.业务子函数接口定义要点 二.完整代码示例 前言 字符串开发模型 : strstr-while/do-while 模型 : 在 字符串 中 查找 子串特征 ; 两头堵模型 : 两个指 ...

最新文章

  1. eclipse中设置python的版本
  2. EOS/普元:中国IT业的悲哀
  3. [导入]ASP.NET MVC框架开发系列课程(3):URL导向.zip(16.66 MB)
  4. 如何在O(1)的时间里删除单链表的结点
  5. xy坐标正负方向_道路施工图纸上x坐标和y坐标分别代表什么方向,哪个代表南北方向,哪个代表东西方向?...
  6. PWA(Progressive Web App)入门系列:Notification
  7. KANO模型分析与使用
  8. C++ 数据抽象 封装 接口
  9. UVA10152 ShellSort【匹配】
  10. 嵌入式语音识别系统是什么
  11. HTML5 — 知识篇总结《I》【入门知识】
  12. 纯前端html导出pdf(jsPDF.js)-分页-不分页
  13. 邮件服务器pop3和imap,POP3服务器和IMAP服务器
  14. PYTHON混淆器 pyobfuscate
  15. 正确卸载IE8并恢复IE6的两种方法
  16. 我遇到了bug,请问该如何解决
  17. 【品牌专场】跨越 X 突破,音视频聚力新机遇
  18. python实现俄罗斯方块小游戏
  19. linux查询服务器品牌命令,查看linux服务器的品牌和型号
  20. Kubernetes集群部署实录

热门文章

  1. 刚刚更新:在线聊天系统设计(原理+思路+源码+效果图)
  2. Lua 函数、闭包、尾调用总结
  3. Python网络编程2:创建套接字和套接字对象的内建方法
  4. 在线转换Postgresql 到Mysql
  5. ALSM_EXCEL_TO_INTERNAL_TABLE
  6. 今天浏览新闻的时候,发现一张图片特别有感触
  7. POJ3335(半平面交)
  8. SQL Server - 使用 Merge 语句实现表数据之间的对比同步
  9. 关于js封装函数的一些东西
  10. 搭建基于域名虚拟主机