首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C 語言指標實作字串反轉:兩種經典演算法完整解析

     編輯:C 語言入門

題目需求

  1. 鍵盤輸入任意字串並輸出
  2. 將字串逆序儲存後再次輸出
  3. 要求使用字元指標完成

解法一:雙指標頭尾對拷

#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;
}

原地反轉優勢

  1. 空間複雜度 O(1):無需額外緩衝區
  2. 雙指標交換:str 從頭、p 從尾,相遇即完成
  3. 適用任意長度:受限於緩衝區大小 MAXN

兩種解法比較

維度解法一 (雙緩衝區)解法二 (原地反轉)
空間複雜度O(n)O(1)
時間複雜度O(n)O(n)
原字串保留是否
程式碼複雜度較簡單稍複雜
適用場景需保留原字串記憶體受限、單純反轉

安全性補充

  • 避免使用 gets():無緩衝區長度檢查,極易緩衝區溢位
  • 推薦 fgets(buf, sizeof(buf), stdin) + 移除換行符
  • 生產環境應檢查輸入長度、處理空字串邊界情況

指標操作核心技巧總結

  1. 指標運算:p + n 移動 n 個元素位置
  2. 解參考賦值:*dst = *src 逐字元拷貝
  3. 雙指標技巧:頭尾、快慢、前後雙指標解決大量陣列/字串問題
  4. 邊界處理:\0 判斷、指標比較 str < p

結語

字串反轉是指標操作的經典入門練習。掌握 雙緩衝區逆序拷貝 與 原地雙指標交換 兩種核心模式,並養成 fgets 替代 gets 的安全習慣,即能靈活應對各類字串操作面試題與實務需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved