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

C語言實現字符串就地逆序(原地反轉)

     編輯:關於C語言

C語言實現字符串就地逆序(原地反轉)

字符串逆序是經典的面試題與基礎算法練習。本文介紹「雙指針交換法」,在原數組上直接操作,空間複雜度 O(1),時間複雜度 O(n),是最高效的原地反轉方案。

核心思路:首尾指針向中間推進

  • 定義兩個指針:start 指向字符串首地址,end 指向最後一個有效字符(即 start + len - 1)。
  • 當 start < end 時,交換兩指針指向的字符,start++,end--。
  • 循環結束即完成逆序。

完整代碼實現

#include <stdio.h>
#include <string.h>
#include <assert.h>

char *my_reverse(char *str) {
    assert(str != NULL);
    char *start = str;
    char *end = str + strlen(str) - 1; // 指向最後一個字符
    char tmp;

    while (start < end) {
        tmp = *start;
        *start = *end;
        *end = tmp;
        start++;
        end--;
    }
    return str; // 返回原指針,支持鏈式調用
}

int main(void) {
    char arr[] = "abcdef"; // 必須用數組,不能用字符串常量指針
    printf("原字符串: %s\n", arr);
    my_reverse(arr);
    printf("逆序後: %s\n", arr); // 輸出 fedcba
    return 0;
}

關鍵點解析

  1. 參數類型: 必須是 char * 且指向可修改的內存(如棧上數組),不能傳入字符串字面量(如 char *p = "abc";),因為字面量通常存放在只讀段,寫入會導致段錯誤。
  2. 長度獲取: 使用標準庫 strlen 計算長度,也可手寫循環計算,避免重複造輪子。
  3. 交換變量: 使用 char tmp 暫存,不可用 int 等大類型,否則可能越界寫入相鄰內存。
  4. 循環條件: start < end 而非 start != end,前者在偶數長度時正確停止,後者可能導致指針交錯多交換一次。

進階:遞歸實現(教學演示)

雖不適合生產環境(棧開銷大),但能體現遞歸思想:

void reverse_recursive(char *start, char *end) {
    if (start >= end) return;
    char tmp = *start;
    *start = *end;
    *end = tmp;
    reverse_recursive(start + 1, end - 1);
}

總結

雙指針原地反轉是字符串操作的基石,掌握它有助於理解數組、指針、內存佈局。實際開發中,若需頻繁反轉,可考慮預分配緩衝區或使用標準庫算法(C++ std::reverse)。

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