#include#include int main() { char a[20] = {0}, b[20] = {0}; char *p1, *p2; printf("任意輸入一個字串: "); gets(a); // 注意:gets 不安全,教學用 p1 = a; // 指向來源字串開頭 p2 = b + strlen(a) - 1; // 指向目標緩衝區末尾 for (; *p1 != '\0'; p1++, p2--) { *p2 = *p1; // 逆序拷貝 } *p2 = '\0'; // 補上結束符 printf("string a is: %s\n", a); printf("string b is: %s\n", b); return 0; }
p2 初始化為 b + len - 1,指向最後一個有效字元位置*p1 != '\0' 處理可變長度字串*p2 = '\0' 確保目標字串正確結束b,避免原地修改干擾#include#include #define MAXN 1000 void reverse(char *str) { char *p = str + strlen(str) - 1; // 指向最後一個字元 char temp; while (str < p) { // 雙指標向中間逼近 temp = *str; *str = *p; *p = temp; str++; p--; } } int main() { char buf[MAXN]; printf("輸入字串: "); fgets(buf, MAXN, stdin); // 較安全 buf[strcspn(buf, "\n")] = '\0'; // 移除換行 printf("原始: %s\n", buf); reverse(buf); printf("反轉: %s\n", buf); return 0; }
str 從頭、p 從尾,相遇即完成MAXN| 維度 | 解法一 (雙緩衝區) | 解法二 (原地反轉) |
|---|---|---|
| 空間複雜度 | O(n) | O(1) |
| 時間複雜度 | O(n) | O(n) |
| 原字串保留 | 是 | 否 |
| 程式碼複雜度 | 較簡單 | 稍複雜 |
| 適用場景 | 需保留原字串 | 記憶體受限、單純反轉 |
gets():無緩衝區長度檢查,極易緩衝區溢位fgets(buf, sizeof(buf), stdin) + 移除換行符p + n 移動 n 個元素位置*dst = *src 逐字元拷貝\0 判斷、指標比較 str < p字串反轉是指標操作的經典入門練習。掌握 雙緩衝區逆序拷貝 與 原地雙指標交換 兩種核心模式,並養成 fgets 替代 gets 的安全習慣,即能靈活應對各類字串操作面試題與實務需求。