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

C 語言實現 itoa 與 atoi:整數與字符串相互轉換核心邏輯

     編輯:關於C語言

背景

標準庫雖提供 sprintf/strtol 等函數,但手寫 itoa(整數轉字符串)與 atoi(字符串轉整數)是理解數值表示、指針運算、邊界處理的經典練習。

itoa 實現:整數 → 字符串

算法思路

  1. 計算最高位權重 power(如 1234 → 1000)
  2. 從高位到低位:digit = num / power,字符 = '0' + digit
  3. 更新 num %= power,power /= 10,循環直到 power == 0
  4. 補齊結束符 '\0'

代碼實現

void itoa(int num, char *str) {
    if (num == 0) { *str++ = '0'; *str = '\0'; return; }
    
    int power = 1;
    for (int tmp = num; tmp > 9; tmp /= 10) power *= 10; // 計算最高位權重
    
    for (; power > 0; power /= 10) {
        int digit = num / power;
        *str++ = '0' + digit;
        num %= power;
    }
    *str = '\0';
}

關鍵點

  • 處理 0 特例,避免 power 計算邏輯失效
  • 指針 str 遞增寫入,調用者需保證緩衝區足夠大(≥12 字節含符號)
  • 負數處理:可先記錄符號,轉正數處理,最後補 '-'

atoi 實現:字符串 → 整數

算法思路

  1. 跳過前導空白
  2. 檢測符號 '+'/'-'
  3. 逐字符累積:result = result * 10 + (ch - '0')
  4. 遇非數字字符停止,返回結果(帶符號)

健壯版代碼

int my_atoi(const char *str) {
    if (!str) return -1; // 空指針錯誤碼
    
    // 跳過空白
    while (*str == ' ' || *str == '\t' || *str == '\n') ++str;
    
    int sign = 1;
    if (*str == '+' || *str == '-') {
        if (*str == '-') sign = -1;
        ++str;
    }
    
    long long result = 0; // 用長長整型檢測溢出
    while (*str >= '0' && *str <= '9') {
        result = result * 10 + (*str - '0');
        if (result * sign > INT_MAX) return INT_MAX; // 溢出飽和
        if (result * sign < INT_MIN) return INT_MIN;
        ++str;
    }
    
    // 非正常結束(如 "123abc")
    if (*str != '\0') return -2; // 格式錯誤碼
    
    return (int)(result * sign);
}

錯誤碼約定

返回值含義
-1空指針輸入
-2字符串包含非法字符(非正常結束)
INT_MAX/INT_MIN數值溢出飽和
其他正常轉換結果

測試驗證

char *tests[] = {"12345", "-12345", "bat-123", "+123abc", "  -42", "2147483648"};
for (int i = 0; i < 6; ++i)
    printf("%s → %d\n", tests[i], my_atoi(tests[i]));
輸出:
12345 → 12345
-12345 → -12345
bat-123 → -2
+123abc → -2
  -42 → -42
2147483648 → 2147483647 (INT_MAX)

對比標準庫

  • atoi:無錯誤報告,非數字返回 0,行為未定義於溢出
  • strtol:標準推薦,支持進制、錯誤指針、errno 溢出檢測
  • 手寫版:教學價值高,生產環境請用 strtol/strtoll

總結

itoa 核心是「除權重取位、取模遞減權重」;atoi 核心是「乘 10 累加、減 '0' 取值」。掌握二者加深對數值編碼、指針遍歷、邊界條件的理解。

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