1. 理解atoi函数的核心需求
atoi(ASCII to Integer)是C标准库中的一个经典函数,用于将字符串转换为32位有符号整数。在LCR 192题中,我们需要手动实现这个功能。与标准库实现不同,面试场景下的atoi需要处理更多边界条件,这也是考察的重点。
实际开发中直接调用库函数即可,但面试场景考察的是对字符串处理和整数溢出的理解深度。
字符串转整数的核心逻辑看似简单:遍历字符串,将每个数字字符转换为对应的数值,并累加计算。但真正的难点在于处理以下特殊情况:
- 前导空格(" 42" → 42)
- 正负号("+42"/"-42")
- 非数字字符中断("4193 with words" → 4193)
- 数值溢出("2147483648" → INT_MAX)
2. 字符串预处理与状态机设计
2.1 处理前导空白字符
规范的atoi实现需要跳过所有前导空白字符,直到遇到第一个非空白字符为止。这包括空格(' ')、制表符('\t')、换行符('\n')等。代码实现通常使用while循环配合isspace()函数:
c复制while (i < str.size() && isspace(str[i])) {
i++;
}
2.2 符号位处理
第一个非空白字符可能是'+'、'-'或数字。需要设置一个符号标志位:
c复制int sign = 1;
if (str[i] == '-') {
sign = -1;
i++;
} else if (str[i] == '+') {
i++;
}
常见错误:未考虑"+-2"这种连续符号的情况,正确的处理应该是遇到符号后立即开始数字解析。
2.3 数字字符转换核心算法
数字转换的核心是ASCII码运算和十进制进位。每个数字字符减去'0'得到实际数值,然后累加到结果中:
c复制while (i < str.size() && isdigit(str[i])) {
int digit = str[i] - '0';
// 溢出检查将在下一节讨论
res = res * 10 + digit;
i++;
}
