原始代碼錯誤
void swap(int *x,int *y,int *z) {
int m; // 定義了 m
if(*y>*x) { t=*y; ... } // 卻使用未聲明的 t → 編譯錯誤
...
}
int *P2, *P3; // 大寫 P
p2=&b; p3=&c; // 使用小寫 p → 編譯錯誤(C區分大小寫)
修正後完整代碼
#include <stdio.h>
void swap_desc(int *x, int *y, int *z) { // 降序排列
int t;
// 確保 *x 最大
if (*y > *x) { t = *y; *y = *x; *x = t; }
if (*z > *x) { t = *z; *z = *x; *x = t; }
// 確保 *y >= *z
if (*z > *y) { t = *y; *y = *z; *z = t; }
}
int main(void) {
int a, b, c;
int *p1, *p2, *p3; // 統一小寫
printf("輸入三個整數: ");
scanf("%d %d %d", &a, &b, &c);
p1 = &a; p2 = &b; p3 = &c;
swap_desc(p1, p2, p3);
printf("降序: %d, %d, %d\n", a, b, c);
return 0;
}
錯誤總結與避坑指南
| 錯誤類型 | 表現 | 修正 |
| 變量名不一致 | 聲明 m 用 t | 統一臨時變量名,建議用 tmp 或 t |
| 大小寫敏感 | P2 vs p2 | C 語言嚴格區分大小寫,養成統一命名風格(如全小寫下劃線) |
| 邏輯不全 | 僅兩兩交換可能不夠 | 三數排序需 3 次比較交換,或調用 qsort/寫通用排序 |
進階寫法:通用比較函數 + qsort
int cmp_desc(const void *a, const void *b) {
return *(int*)b - *(int*)a;
}
int main() {
int a[3];
scanf("%d%d%d", &a[0], &a[1], &a[2]);
qsort(a, 3, sizeof(int), cmp_desc);
printf("%d %d %d\n", a[0], a[1], a[2]);
}