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

C語言字符串反序函數錯誤修正:邏輯重構與輸出補全

     編輯:C 語言問答

原代碼問題分析

void fanxu(char a[]) {
    int i, j;
    for (i = 0; a[i] != '\0'; i++);   // ① 計算長度,i 停在 '\0' 處
    for (j = 0; i >= 0;)              // ② 邏輯錯誤:i 從 len 遞減至 0,包含 '\0'
        a[j++] = a[i--];              // ③ 覆蓋原數組,導致數據丟失
    a[j] = '\0';
}

三大致命缺陷

  1. 就地反轉覆蓋數據:讀寫同一數組,前半部分尚未讀取時已被寫入覆蓋。
  2. 索引越界:i 初值為字符串長度(指向 '\0'),a[i] 讀取結束符而非最後一個有效字符。
  3. 缺少輸出:函數名 fanxu 暗示「反序輸出」,但無任何 printf/putchar。

正確實現三種模式

模式 1:輔助數組法(教學最清晰)

void reverse_print(const char *str) {
    int len = 0;
    while (str[len]) len++;
    for (int i = len - 1; i >= 0; i--)
        putchar(str[i]);
    putchar('\n');
}

模式 2:就地反轉(雙指針交換,O(1) 空間)

void reverse_inplace(char *str) {
    char *left = str;
    char *right = str + strlen(str) - 1;
    while (left < right) {
        char tmp = *left;
        *left++ = *right;
        *right-- = tmp;
    }
}

模式 3:遞歸打印(展示棧帧原理)

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

完整可測試主程序

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

void reverse_print(const char *str);
void reverse_inplace(char *str);

int main() {
    char buf[100];
    printf("輸入字符串: ");
    fgets(buf, sizeof(buf), stdin);
    buf[strcspn(buf, "\n")] = '\0';  // 去換行

    printf("反序輸出: ");
    reverse_print(buf);

    reverse_inplace(buf);
    printf("就地反轉後: %s\n", buf);
    return 0;
}

核心知識點回顧

  • strlen 返回**不含** '\0' 的長度,有效索引 0 ~ len-1。
  • 字符串字面量 "abc" 存放在只讀區,**不能**傳給就地修改函數,需用數組 char a[] = "abc";。
  • const char * 參數承諾不修改內容,配合模式 1/3 更安全。

掌握字符串反轉的三種寫法,可靈活應對面試、嵌入式受限環境、算法題不同場景需求。

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