atoi(字串轉整數)與 itoa(整數轉字串)是 C 語言面試高頻手寫題。這裡提供健壯、可直接生產使用的參考實現。
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);
}
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 等邊界情況。