原程式嘗試用指標交換來排序三字串,但 swap 函數內部修改的是區域指標變數,無法影響 main 中的 m, n, k。且字串比較應用 strcmp,而非逐字元比較指標位址。
swap(char *p, char *q) 接收指標的副本,函數內 p = q 只改變區域副本。"abc" > "def" 比較的是字面常數的記憶體位址,非字典序。printf("%s", m) 印的是 m 指向的內容,若 m 本身未變,輸出不變。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_str(const void *a, const void *b) {
return strcmp(*(const char**)a, *(const char**)b);
}
int main() {
char *strs[3];
char buf[3][20];
for (int i = 0; i < 3; i++) {
scanf("%19s", buf[i]);
strs[i] = buf[i];
}
qsort(strs, 3, sizeof(char*), cmp_str);
for (int i = 0; i < 3; i++) printf("%s ", strs[i]);
return 0;
}
void sort_strs(char *a[], int n) {
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-1-i; j++)
if (strcmp(a[j], a[j+1]) > 0) {
char *tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
strcmp(或 strncmp),回傳 <0, 0, >0 對應字典序。char **(指標的指標)。