atoi 函数
atoi
在遇到第一个非数字字符时立即停止转换,后续字符被忽略。
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *test_strs[] = {
"123", // 有效整数
" 456 ", // 前后有空格
"-789", // 负数
"+1000", // 正数带符号
"abc123", // 非数字字符(返回0?)
"123abc", // 同上
"", // 空字符串(返回0?)
"0001", // 前导零
"2147483647", // INT_MAX
"2147483648" // INT_MAX +1(溢出)
};
for (int i = 0; i < sizeof(test_strs)/sizeof(test_strs[0]); i++) {
printf("atoi(\"%s\") = %d\n", test_strs[i], atoi(test_strs[i]));
}
return 0;
}
atoi("123") = 123
atoi(" 456 ") = 456
atoi("-789") = -789
atoi("+1000") = 1000
atoi("abc123") = 0 // 未定义行为!实际可能返回随机值
atoi("123abc") = 123 // 未定义行为!实际可能返回随机值
atoi("") = 0 // 未定义行为!实际可能返回随机值
atoi("0001") = 1
atoi("2147483647") = 2147483647
atoi("2147483648") = -2147483648 // 溢出导致未定义行为
对非数字字符的处理
- 问题:
atoi
在遇到第一个非数字字符时立即停止转换,后续字符被忽略。 - 示例:
"123a45"
→ 返回123
,但未报错。 - 风险:无法检测输入是否合法(如
"123abc"
可能被误认为123
)。
2. 前导零的处理
- 行为:自动忽略前导零,
"0001"
→1
。 - 注意:这与你的需求一致,但需确保字符串确实表示整数。
3. 符号处理
- 规则:仅允许单个
+
或-
,且必须位于字符串开头(忽略空格后)。 - 示例:
"-+123"
→ 未定义行为(可能返回0
或随机值)。
4. 空字符串与异常输入
- 空字符串:
""
→ 未定义行为(可能返回0
)。 - 无数字字符:
"abc"
→ 未定义行为(可能返回0
)。
5. 溢出问题
- 风险:当输入超出
int
范围时,结果可能截断或取反(如INT_MAX + 1
→-INT_MIN
)。 - 示例:
"2147483648"
在 32 位系统中可能返回-2147483648
。