【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、二級指針案例 ( 返回自定義二級指針 | 精準控制內存大小 )
- 二、完整代碼示例
一、二級指針案例 ( 返回自定義二級指針 | 精準控制內存大小 )
博客 【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 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】二级指针案例 ( 字符串切割
- 下一篇: 【C 语言】数组 ( 数组本质 | 数组