首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C 合併並排序指針數組與二維字符數組:動態內存管理完整示例

     編輯:C++ 入門

問題描述

有一個指針數組 char *array1[] 和一個二維數組 char array2[][30],需將兩者所有字符串合併、按字典序排序,返回新分配的指針數組,並提供釋放函數。

實現要點

  1. 計算總長度 len = n1 + n2。
  2. 分配指針數組 char **tmp = malloc(len * sizeof(char*))。
  3. 為每個指針分配字符串空間 malloc(30) 並 memset。
  4. 用 strcpy 複製兩個源數組的內容。
  5. 選擇排序(或 qsort)按 strcmp 排序。
  6. 返回 tmp 並通過輸出參數返回長度。
  7. 釋放函數依次 free 每個字符串,再 free 指針數組。

完整代碼

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

char **mergeAndSort(char **arr1, int n1, char (*arr2)[30], int n2, int *outLen) {
    int len = n1 + n2;
    char **tmp = (char**)malloc(len * sizeof(char*));
    for (int i = 0; i < len; ++i) {
        tmp[i] = (char*)malloc(30);
        memset(tmp[i], 0, 30);
    }
    for (int i = 0; i < n1; ++i) strcpy(tmp[i], arr1[i]);
    for (int i = 0; i < n2; ++i) strcpy(tmp[n1 + i], arr2[i]);
    // 簡單選擇排序
    for (int i = 0; i < len; ++i)
        for (int j = i+1; j < len; ++j)
            if (strcmp(tmp[i], tmp[j]) > 0) {
                char t[30]; strcpy(t, tmp[i]);
                strcpy(tmp[i], tmp[j]); strcpy(tmp[j], t);
            }
    *outLen = len;
    return tmp;
}

void freeArray(char **arr, int len) {
    if (!arr) return;
    for (int i = 0; i < len; ++i) if (arr[i]) free(arr[i]);
    free(arr);
}

int main() {
    char *a1[] = {"bbbbb", "aaaaa", "ccccc", "22222", "11111", "44444"};
    char a2[10][30] = {"zzzz", "yyyy", "333333"};
    int n3;
    char **a3 = mergeAndSort(a1, 6, a2, 3, &n3);
    for (int i = 0; i < n3; ++i) printf("%s\n", a3[i]);
    freeArray(a3, n3);
    return 0;
}

輸出示例

11111
22222
333333
44444
aaaaa
bbbbb
ccccc
yyyy
zzzz

注意事項

  • 調用者負責調用 freeArray 釋放內存,避免洩漏。
  • 字符串長度固定 30,實際項目中可傳入最大長度參數。
  • 排序算法可替換為 qsort 提高效率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved