標準庫雖提供 sprintf/strtol 等函數,但手寫 itoa(整數轉字符串)與 atoi(字符串轉整數)是理解數值表示、指針運算、邊界處理的經典練習。
power(如 1234 → 1000)digit = num / power,字符 = '0' + digitnum %= power,power /= 10,循環直到 power == 0'\0'void itoa(int num, char *str) {
if (num == 0) { *str++ = '0'; *str = '\0'; return; }
int power = 1;
for (int tmp = num; tmp > 9; tmp /= 10) power *= 10; // 計算最高位權重
for (; power > 0; power /= 10) {
int digit = num / power;
*str++ = '0' + digit;
num %= power;
}
*str = '\0';
}
power 計算邏輯失效str 遞增寫入,調用者需保證緩衝區足夠大(≥12 字節含符號)'-''+'/'-'result = result * 10 + (ch - '0')int my_atoi(const char *str) {
if (!str) return -1; // 空指針錯誤碼
// 跳過空白
while (*str == ' ' || *str == '\t' || *str == '\n') ++str;
int sign = 1;
if (*str == '+' || *str == '-') {
if (*str == '-') sign = -1;
++str;
}
long long result = 0; // 用長長整型檢測溢出
while (*str >= '0' && *str <= '9') {
result = result * 10 + (*str - '0');
if (result * sign > INT_MAX) return INT_MAX; // 溢出飽和
if (result * sign < INT_MIN) return INT_MIN;
++str;
}
// 非正常結束(如 "123abc")
if (*str != '\0') return -2; // 格式錯誤碼
return (int)(result * sign);
}
| 返回值 | 含義 |
|---|---|
| -1 | 空指針輸入 |
| -2 | 字符串包含非法字符(非正常結束) |
| INT_MAX/INT_MIN | 數值溢出飽和 |
| 其他 | 正常轉換結果 |
char *tests[] = {"12345", "-12345", "bat-123", "+123abc", " -42", "2147483648"};
for (int i = 0; i < 6; ++i)
printf("%s → %d\n", tests[i], my_atoi(tests[i]));
輸出:
12345 → 12345
-12345 → -12345
bat-123 → -2
+123abc → -2
-42 → -42
2147483648 → 2147483647 (INT_MAX)
atoi:無錯誤報告,非數字返回 0,行為未定義於溢出strtol:標準推薦,支持進制、錯誤指針、errno 溢出檢測strtol/strtollitoa 核心是「除權重取位、取模遞減權重」;atoi 核心是「乘 10 累加、減 '0' 取值」。掌握二者加深對數值編碼、指針遍歷、邊界條件的理解。