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

C 語言練習:字串反轉的四種演算法實作比較

     編輯:關於C語言

字串反轉演算法大比拚:指標運算、索引交換、標準庫函數四種寫法

將輸入字串逆序輸出是經典 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) 空間

方法二:strlen 定位尾部

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 邊界

方法四:strlen 優化版就地反轉

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 結尾,反轉後結尾字元會移至開頭,若需作為字串使用需手動調整
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved