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

C++ 手寫 atoi:完整處理空格、符號、溢出與非法字符

     編輯:關於C++

函數簽名與要求

實現 int myAtoi(string str),模擬標準庫 atoi 行為,需處理:

  1. 前導空格
  2. 可選的 '+' / '-' 符號
  3. 連續數字字符(遇非數字停止)
  4. 32 位有符號整數溢出鉗制(INT_MIN ~ INT_MAX)
  5. 空字符串或無有效數字返回 0

核心邏輯

int myAtoi(string str) {
    if (str.empty()) return 0;
    int i = 0, n = str.size();
    // 1. 跳過前導空格
    while (i < n && str[i] == ' ') ++i;
    if (i == n) return 0;
    // 2. 符號
    bool neg = false;
    if (str[i] == '+' || str[i] == '-') {
        neg = (str[i] == '-');
        ++i;
    }
    // 3. 解析數字
    long long val = 0; // 用 long long 暫存防溢出
    while (i < n && isdigit(str[i])) {
        val = val * 10 + (str[i] - '0');
        if (!neg && val > INT_MAX)  return INT_MAX;
        if (neg  && -val < INT_MIN) return INT_MIN;
        ++i;
    }
    return neg ? -val : val;
}

關鍵細節

  • long long 中間變量:避免邊界檢查時自身溢出。
  • 即時鉗制:累積過程中即判斷,無需等結束。
  • 非數字即停:"4193 with words" → 4193。
  • 無數字歸 0:"words 987" → 0。

測試用例

輸入輸出說明
"42"42正常
" -42"-42前導空格+負號
"4193 with words"4193非數字截斷
"words and 987"0無有效數字
"-91283472332"-2147483648下溢鉗制
"+1"1顯式正號
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved