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

C語言字符串就地逆序:雙指針交換標準實現與 MSVC 源碼對比

     編輯:關於C語言

面試高頻題:字符串原地反轉

輸入 "abcd" → 輸出 "dcba",要求 O(1) 額外空間。

標準雙指針算法


char *strrev(char *s) {
    char *start = s;
    char *left = s;
    char ch;
    while (*s++) ;        // 找到結束符
    s -= 2;               // 回退到最後一個有效字符
    while (left < s) {
        ch = *left;
        *left++ = *s;
        *s-- = ch;
    }
    return start;
}

關鍵細節解析

  • while (*s++) 循環結束時 s 指向 \0 之後。
  • s -= 2:第一次 -- 回到 \0,第二次 -- 回到最後一個字符。
  • left < s 條件自動處理奇/偶長度,中間字符無需交換。

MSVC CRT 實現對比


char * __cdecl strrev(char *string) {
    char *start = string;
    char *left = string;
    char ch;
    while (*string++);
    string -= 2;
    while (left < string) {
        ch = *left;
        *left++ = *string;
        *string-- = ch;
    }
    return start;
}

邏輯完全一致,變量命名更規範,無多餘變量。

測試主程式


int main() {
    char buf[200];
    printf("輸入字符串:");
    fgets(buf, sizeof(buf), stdin);
    buf[strcspn(buf, "\n")] = 0;  // 去換行
    printf("逆序:%s\n", strrev(buf));
    return 0;
}

避坑指南

  • 輸入緩衝區必須可寫(字面量常量區不可寫)。
  • 空字符串、單字符邊界情況自動正確處理。
  • 若需保留原字符串,先 strcpy 複製再反轉副本。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved