方法一:雙指針原地交換 (最優、迭代)
char *reverse(char *s) {
if (!s) return NULL;
char *l = s, *r = s;
while (*r) r++; r--; // r 指向最後一字元 (非 \0)
while (l < r) {
char tmp = *l; *l = *r; *r = tmp;
l++; r--;
}
return s;
}
方法二:遞迴利用調用棧 (輸出逆序、不修改原字串)
void reverse_print(const char *s) {
if (!*s) return;
reverse_print(s+1);
putchar(*s);
}
// 原理: 先遞迴到末尾,回溯時依序輸出 -> 逆序
方法三:遞迴原地交換 (教學展示)
void reverse_rec_swap(char *s, int len) {
if (len <= 1) return;
char tmp = s[0];
s[0] = s[len-1];
s[len-1] = '\0'; // 暫時截斷,遞迴處理中間
reverse_rec_swap(s+1, len-2);
s[len-1] = tmp; // 恢復
}
方法四:標準庫 (C++)
#include
#include
std::reverse(str.begin(), str.end()); // C++ 僅供參考
測試主程式
int main() {
char s1[] = "abcdef";
reverse(s1);
puts(s1); // fedcba
char s2[] = "hello";
reverse_print(s2); // olleh
putchar('\n');
return 0;
}