有一個指針數組 char *array1[] 和一個二維數組 char array2[][30],需將兩者所有字符串合併、按字典序排序,返回新分配的指針數組,並提供釋放函數。
len = n1 + n2。char **tmp = malloc(len * sizeof(char*))。malloc(30) 並 memset。strcpy 複製兩個源數組的內容。qsort)按 strcmp 排序。tmp 並通過輸出參數返回長度。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 釋放內存,避免洩漏。qsort 提高效率。