<cstdlib>
int atoi(const char* str);
template<typename T>
T atoi_impl(const char* str)
{
// (1) 走过前面若干位空格: 强转为 unsigned char -> isspace(.)
while (std::isspace((unsigned char)(*str) ) )
++str;
// (2) 求 符合位标志
int sign = 1;
if (*str == '+')
{
++str;
}
else if (*str == '-')
{
++str;
sign = -1;
}
// (3) 强转为 unsigned char -> isdigit(.) 判断是数字才处理
// [1] 取出数字 *str - '0' [2] 旧结果 成10(右边多1个0) [3] 更新结果: 加上当前 sign* 数字
T result = 0;
while (std::isdigit((unsigned char)(*str) ) )
{
int digit = *str - '0';
result *= 10;
result += sign * digit;
++str;
}
return result;
}
int atoi(const char* str)
{
return atoi_impl<int>(str);
}
网友评论