+/-。INT_MAX (2147483647) 或 INT_MIN (-2147483648)。while (*str == ' ') str++;sign = 1/-1,指針後移。sum = sum * 10 + (*str - '0'),用 long long 避免中間溢出。if (*str < '0' || *str > '9') break;sum > INT_MAX(正數)或 sum > (long long)INT_MAX + 1(負數)。int myAtoi(char *str) {
int sign = 1;
long long sum = 0; // 防止中間溢出
if (!str) return 0;
while (*str == ' ') str++; // 1. 跳過空格
if (*str == '-') { sign = -1; str++; } // 2. 符號
else if (*str == '+') { sign = 1; str++; }
while (*str) { // 3. 累加數字
if (*str < '0' || *str > '9') break;
sum = sum * 10 + (*str - '0');
if (sign == 1 && sum > INT_MAX) return INT_MAX; // 4. 正溢出
if (sign == -1 && sum > (long long)INT_MAX + 1) return INT_MIN; // 負溢出
str++;
}
return (int)(sum * sign);
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
"42" | 42 | 正常 |
" -42" | -42 | 前導空格+負號 |
"4193 with words" | 4193 | 非數字截斷 |
"words and 987" | 0 | 首字符非數字/符號 |
"-91283472332" | -2147483648 | 負溢出 |
"+-12" | 0 | 雙符號無效 |
" 0000000000012345678" | 12345678 | 前導零 |
"" | 0 | 空字符串 |
int 累加導致中間溢出未檢測 → **必須用 long long 或每步檢查 sum > INT_MAX/10 等技巧**。"+-12" 類雙符號 → 符號處理後應立即進入數字循環,遇非數字直接斷開。INT_MIN = -2147483648,絕對值 2147483648 超出 INT_MAX,故負數判斷閾值為 (long long)INT_MAX + 1。atoi 標準庫行為未定義於溢出,**手寫實現必須明確截斷**。atoi 看似簡單,實則邊界條件極多(空格、符號、非數字、溢出、空串)。掌握「長整型累加 + 即時溢出檢查 + 單次遍歷」模板,可應對所有字符串轉數字類問題(如 strtol、科學計數法解析等)。