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

C語言字符串反序輸出:多種實現方式與不使用strlen計算長度

     編輯:C 語言問答

問題描述

輸入字符串(如"windows"),輸出反序字符串("swodniw")。要求:不使用strlen計算長度。

核心思路

字符串在內存中以\0結尾。反序本質是首尾字符交換,直到中間相遇。

方案一:雙指針交換 (標準庫版)

#include 
#include 

void reverse_str(char *str) {
    int len = strlen(str);
    for (int i = 0, j = len - 1; i < j; i++, j--) {
        char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
    }
}

int main() {
    char s[200];
    scanf("%s", s);
    reverse_str(s);
    printf("%s\n", s);
    return 0;
}

方案二:不使用strlen計算長度

方法1:while循環遍歷

int len = 0;
while (str[len] != '\0') len++;  // 或簡寫 while(str[len++]); len--;

方法2:for循環遍歷

int len;
for (len = 0; str[len]; len++);

方法3:指針算術

char *p = str;
while (*p++) ;  // p 指向 \0 後一位
int len = p - str - 1;

方案三:遞歸實現 (不需顯式長度)

void reverse_recursive(char *str) {
    if (*str) {
        reverse_recursive(str + 1);
        putchar(*str);
    }
}

int main() {
    char s[200];
    scanf("%s", s);
    reverse_recursive(s);
    putchar('\n');
    return 0;
}

原理:遞歸到達字符串末尾(\0)返回,回溯過程中依次打印字符,實現反序輸出。注意:此法不修改原字符串,僅反序輸出;長字符串可能棧溢出。

方案四:標準庫strrev (非標準,MSVC扩展)

#include 
strrev(str);  // 原地反轉,返回str指針
// GCC/Clang 不支持,需自行實現

完整對比示例

#include 
#include 

// 1. 雙指針 + 手動計算長度
void reverse1(char *s) {
    int len = 0;
    while (s[len]) len++;
    for (int i = 0, j = len - 1; i < j; i++, j--) {
        char t = s[i]; s[i] = s[j]; s[j] = t;
    }
}

// 2. 指針版 (無索引變量)
void reverse2(char *s) {
    char *p = s;
    while (*p) p++;  // p 指向 \0
    p--;             // 指向最後一個有效字符
    while (s < p) {
        char t = *s; *s++ = *p; *p-- = t;
    }
}

// 3. 遞歸輸出 (不修改原串)
void reverse_print(const char *s) {
    if (*s) {
        reverse_print(s + 1);
        putchar(*s);
    }
}

int main() {
    char str[200];
    printf("輸入字符串: ");
    scanf("%199s", str);  // 防溢出
    
    printf("方法1結果: ");
    reverse1(str);
    puts(str);
    
    scanf("%199s", str);
    printf("方法2結果: ");
    reverse2(str);
    puts(str);
    
    scanf("%199s", str);
    printf("方法3輸出: ");
    reverse_print(str);
    putchar('\n');
    return 0;
}

關鍵點總結

  1. 字符串結束標志:\0是計算長度、遍歷的核心依據
  2. 指針 vs 索引:指針版本更符合C語言風格,效率略高
  3. 原地反轉 vs 輸出反序:前者修改內存,後者僅改變輸出順序
  4. 邊界條件:空字符串、單字符、超長輸入(緩衝區溢出防護)
  5. 遞歸局限:棧深度限制,不適用於極長字符串

面試常見延伸

  • 不使用臨時變量交換兩字符 (XOR交換法)
  • 反轉單詞順序而非字符順序 ("hello world" → "world hello")
  • UTF-8多字節字符串反轉的複雜性

字符串反序是指針操作、循環控制、遞歸思維的經典綜合練習。建議熟練掌握雙指針原地反轉法,理解遞歸版本的優雅與局限。

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