輸入:"China", "America", "Australia", "France", "Germany"
輸出:按 ASCII 字母序遞增排序。
直接對二維字元陣列 char name[5][20] 排序需 strcpy 交換整串字元,效率低且易溢位。
改用 字串指標陣列 char *names[5],排序時僅交換指標值(4/8 位元組),極快且安全。
#include <stdio.h>
#include <string.h>
#define N 5
void sort(char *name[]) {
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if (strcmp(name[i], name[j]) > 0) { // name[i] > name[j]
char *tmp = name[i];
name[i] = name[j];
name[j] = tmp; // ✅ 正確交換
}
}
}
}
void print(char *name[]) {
for (int i = 0; i < N; i++)
printf("%s ", name[i]);
putchar('\n');
}
int main() {
char *names[N] = {"China", "America", "Australia", "France", "Germany"};
sort(names);
print(names); // America Australia China France Germany
return 0;
}
原碼 Bug 修正:第 17 行原為name[i] = name[i+1]錯誤,應為name[i] = name[j]。
| 函式/語法 | 說明 |
|---|---|
strcmp(s1, s2) | >0:s1>s2;==0:相等;<0:s1 |
char *names[] | 指標陣列,每元素指向字串常數區(唯讀) |
printf("%s", ptr) | %s 期望 char*,直接傳指標,不可 解參考 *ptr |
int cmp(const void *a, const void *b) {
return strcmp(*(char**)a, *(char**)b);
}
qsort(names, N, sizeof(char*), cmp);
字串排序首選指標陣列 + 交換指標模式:空間 O(n)、交換 O(1)、程式碼簡潔。配合 strcmp 比較、qsort 庫函式,是 C 語言處理字串集合的標準範式。