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

C語言實作 itoa:整數轉字串遞迴演算法完整解析

     編輯:關於C

函式規格

int itoa(int n, char s[]);
// 將整數 n 轉為字串存入 s,回傳字串長度(或 void)

遞迴演算法邏輯

  1. 基底情況:`n < 10` → 直接轉字元 `n+'0'` 存入 `s[i]`。
  2. 遞迴步驟:先處理 `n/10`(高位),再處理 `n%10`(低位)。
  3. 使用全域/靜態變數 `i` 追蹤寫入索引。

原始碼分析與修正

#include 

static int idx = 0; // 靜態區域變數,避免全域污染

void itoa_rec(int n, char s[]) {
    if (n < 0) { // 處理負數
        s[idx++] = '-';
        n = -n;
    }
    if (n < 10) {
        s[idx++] = n + '0';
    } else {
        itoa_rec(n / 10, s); // 先遞迴處理高位
        s[idx++] = n % 10 + '0'; // 再處理當前低位
    }
    s[idx] = '\0'; // 結束符
}

int main() {
    char s[20];
    int num;
    printf("Enter integer: ");
    scanf("%d", &num);
    idx = 0; // 每次呼叫前重置
    itoa_rec(num, s);
    printf("String: %s\n", s);
    return 0;
}

關鍵問題修正

原始碼問題修正
負數未處理加入 `n<0` 判斷,輸出 `-` 並取絕對值
全域 `i` 未重置改為 `static` 區域變數,`main` 中手動 `idx=0`
遞迴順序邏輯輕微錯誤先遞迴 `n/10`,再寫 `n%10`,確保高位在前
缺少 `\0` 結束每次寫入後 `s[idx]='\0'`

迭代版本(更高效、無堆疊風險)

void itoa_iter(int n, char s[]) {
    int i = 0, sign = n;
    if (n < 0) n = -n;
    do {
        s[i++] = n % 10 + '0';
    } while (n /= 10);
    if (sign < 0) s[i++] = '-';
    s[i] = '\0';
    // 反轉字串
    for (int l = 0, r = i-1; l < r; l++, r--) {
        char t = s[l]; s[l] = s[r]; s[r] = t;
    }
}

標準庫 vs 手寫

  • 標準 `sprintf(s, "%d", n)` / `snprintf`:安全、支援寬度、旗標、地區化。
  • 手寫 `itoa`:教學理解遞迴/迭代轉換、嵌入式無標準庫環境。

總結

整數轉字串核心是**「除 10 取餘、逆序輸出」**。遞迴利用呼叫堆疊自動反序,迭代需手動反轉字串。注意負數處理、索引重置、結束符寫入三大細節。

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