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

C語言實作 atoi:字串轉整數完整解析與邊界處理

     編輯:關於C

函式規格

int my_atoi(const char *s);
// 忽略前導空白、處理 +/- 號、讀取數字字元直到非數字、回傳整數
// 溢出行為:標準 atoi 未定義,strtol 可檢測

核心演算法

  1. 跳過前導空白字元(`isspace`)。
  2. 檢查正負號,記錄 `sign`(1 或 -1)。
  3. 逐字元讀取 `'0'~'9'`,累加:`result = result*10 + (c-'0')`。
  4. 遇到非數字字元停止。
  5. 回傳 `sign * result`。

完整健壯版實作

#include 
#include 

int my_atoi(const char *str) {
    if (!str) return 0;

    // 1. 跳過空白
    while (isspace(*str)) str++;

    // 2. 處理正負號
    int sign = 1;
    if (*str == '+' || *str == '-') {
        sign = (*str == '-') ? -1 : 1;
        str++;
    }

    // 3. 累加數字
    long long result = 0; // 用長整數偵測溢出
    while (isdigit(*str)) {
        result = result * 10 + (*str - '0');
        // 溢出檢測
        if (sign == 1 && result > INT_MAX) return INT_MAX;
        if (sign == -1 && -result < INT_MIN) return INT_MIN;
        str++;
    }

    return (int)(sign * result);
}

原始碼問題分析

原始碼缺陷影響修正
未處理前導空白`" 123"` 回傳 0加入 `isspace` 迴圈
未檢查 `isdigit``"12a3"` 會把 `a` 當數字處理`while(isdigit(*p))`
無溢出保護`"2147483648"` 行為未定義用 `long long` 累加並比較 `INT_MAX/MIN`
參數 `char s[5]` 限制長度無法處理長字串改為 `const char *`
使用 `gets`(危險、已移除)緩衝區溢位風險用 `fgets` 或 `scanf("%19s")`

標準庫對比

  • `atoi`:簡單但無錯誤回報、溢出未定義。
  • `strtol` / `strtoll`:**推薦使用**,支援錯誤指標、基數轉換、溢出檢測。

測試案例

int main() {
    printf("%d\n", my_atoi("   -123"));   // -123
    printf("%d\n", my_atoi("+456abc"));   // 456
    printf("%d\n", my_atoi("2147483647")); // INT_MAX
    printf("%d\n", my_atoi("-2147483648")); // INT_MIN
    printf("%d\n", my_atoi("   "));        // 0
    return 0;
}

總結

手寫 `atoi` 核心是**有限狀態機**:空白 → 符號 → 數字 → 停止。生產代碼**必須**處理空白、溢出、非數字終止。面試時寫出健壯版並解釋每個邊界條件處理,即為加分項。

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