將輸入字串逆序輸出是經典 C 語言指標與陣列練習。本文展示四種不同思路的實作,分析優缺點。
#include <stdio.h>
#include <string.h>
void fanxu(char *zf); // 反序函數
int main() {
char a[80];
do {
gets(a); // 讀取輸入 (教學用,實務建議 fgets)
fanxu(a); // 呼叫反轉
printf("是否繼續(y/n): ");
gets(a);
} while (*a != 'n');
return 0;
}
void fanxu(char *zf) {
char *pc = zf;
while (*++pc); // 移至字串結尾 \0
pc--; // 退回最後一個字元
while (pc >= zf) {
putchar(*pc); // 從尾向頭輸出
pc--;
}
putchar('\n');
}
特點:純指標運算、不修改原字串、單次掃描、O(n) 時間 O(1) 空間
void fanxu(char *zf) {
char *pc = zf + strlen(zf); // 直接指向 \0
while (--pc >= zf) {
putchar(*pc);
}
}
特點:利用標準庫簡化邏輯、可讀性較好
void fanxu(char *zf) {
int i, n;
char temp;
for (n = 0; *(zf + n) != '\0'; n++); // 計算長度
n--;
for (i = 0; i < n - i; i++) {
temp = zf[i];
zf[i] = zf[n - i];
zf[n - i] = temp;
}
puts(zf); // 輸出修改後字串
}
特點:原地修改字串、雙指標交換經典模式、需注意 n-i 邊界
void fanxu(char *zf) {
int i, n = strlen(zf) - 1;
char temp;
for (i = 0; i < n - i; i++) {
temp = zf[i];
zf[i] = zf[n - i];
zf[n - i] = temp;
}
puts(zf);
}
特點:最簡潔、標準庫配合索引交換、工程實務首選
| 方法 | 修改原串 | 額外空間 | 適用場景 |
|---|---|---|---|
| 指標掃描輸出 | 否 | O(1) | 只需輸出、不可修改輸入 |
| strlen+指標輸出 | 否 | O(1) | 同上,程式碼更短 |
| 索引交換 | 是 | O(1) | 需保留反轉結果供後續使用 |
| strlen+索引交換 | 是 | O(1) | 工程標準寫法 |
gets 無緩衝區保護,實務必用 fgets(buf, sizeof(buf), stdin)i < n - i 等價於 i < (n+1)/2,避免重複交換中間字元\0 結尾,反轉後結尾字元會移至開頭,若需作為字串使用需手動調整