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

C 語言手寫 atoi 與 itoa 完整實現(面試必備)

     編輯:關於C語言

背景

atoi(字串轉整數)與 itoa(整數轉字串)是 C 語言面試高頻手寫題。這裡提供健壯、可直接生產使用的參考實現。

atoi 實現:字串轉整數

int my_atoi(const char *str) {
    if (!str) return 0;
    
    int sign = 1, i = 0;
    long long result = 0;  // 用長整型防溢出檢測
    
    // 跳過前導空格
    while (str[i] == ' ') i++;
    
    // 處理符號
    if (str[i] == '-') { sign = -1; i++; }
    else if (str[i] == '+') { i++; }
    
    // 數字轉換
    for (; str[i] >= '0' && str[i] <= '9'; i++) {
        result = result * 10 + (str[i] - '0');
        // 溢出保護
        if (sign == 1 && result > INT_MAX) return INT_MAX;
        if (sign == -1 && -result < INT_MIN) return INT_MIN;
    }
    
    return (int)(sign * result);
}

itoa 實現:整數轉字串(支援任意進制)

char *my_itoa(int value, char *str, int base) {
    static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (base < 2 || base > 36) return NULL;
    
    char *ptr = str, *ptr1 = str;
    long long n = value;
    int sign = 0;
    
    // 處理負數(僅十進制)
    if (value < 0 && base == 10) {
        sign = 1;
        n = -n;
    }
    
    // 從低位到高位生成字符
    do {
        *ptr++ = digits[n % base];
        n /= base;
    } while (n);
    
    // 添加負號
    if (sign) *ptr++ = '-';
    *ptr = '\0';
    
    // 反轉字串
    for (ptr--; ptr1 < ptr; ptr1++, ptr--) {
        char tmp = *ptr1; *ptr1 = *ptr; *ptr = tmp;
    }
    return str;
}

關鍵優化點

問題解決方案
溢出處理用 long long 累積,邊界檢查返回 INT_MAX/MIN
空指針/空字串開頭檢查返回 0
前導空格atoi 標準行為:跳過空格
進制支援itoa 支援 2~36 進制,字符表通用
負數處理僅十進制加負號,其他進制視為無符號

測試建議

測試用例:"123"、"-456"、" 789"、"abc"、INT_MIN、INT_MAX、base=2/8/16 等邊界情況。

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