2022-09-24  本文已影响0人  my_passion

<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);
}
上一篇下一篇

猜你喜欢

热点阅读