字符串转换成整数

题目描述

输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。

给定函数原型int StrToInt(const char *str) ,实现字符串转换成整数的功能,不能使用库函数atoi。

注意一下几点:

  1. 空指针输入:输入的是指针,在访问空指针时程序会崩溃,因此在使用指针之前需要先判断指针是否为空。
  2. 正负符号:整数不仅包含数字,还有可能是以'+'或'-'开头表示正负整数,因此如果第一个字符是'-'号,则要把得到的整数转换成负整数。
  3. 非法字符:输入的字符串中可能含有不是数字的字符。因此,每当碰到这些非法的字符,程序应停止转换。
  4. 整型溢出:输入的数字是以字符串的形式输入,因此输入一个很长的字符串将可能导致溢出。

完整参考代码如下:(溢出可以使用long long类型或者不用也可以)

int strtoint(char *str)
{
    int MAX_INT = (unsigned)~0 >> 1;
    int MIN_INT = -((unsigned)~0 >> 1) - 1;

    int sign = 1;
    int res = 0;

    if(str == 0)
    {
        return 0;
    }

    while(isspace(*str))
    {
        ++str;
    }

    if(*str == '-')
    {
        sign = false;
        ++str;
    }
    else if(*str == '+')
    {
        ++str;
    }


    while(isdigit(*str))
    {
        int temp = *str - '0';
        if(sign && (res > MAX_INT / 10 || res == MAX_INT / 10 && temp > MAX_INT % 10))
        {
            return MAX_INT;
        }


        if(!sign && (res > (unsigned)MIN_INT / 10 || res == (unsigned)MIN_INT / 10 && temp > (unsigned)MIN_INT % 10))
        {
            return MIN_INT;
        }

        res = res * 10 + temp;
        ++str;
    }

    return sign ? res : -res;
}
int myAtoi(string str) {
    long long res = 0;
    int i = 0;
    bool flag = true;
    while(str[i] == ' ')
    {
        ++i;
    }
    if(str[i] == '-')
    {
        flag = false;
        ++i;
    }
    else if(str[i] == '+')
    {
        flag = true;
        ++i;
    }
    int temp = 0;
    for(; i < str.size(); ++i)
    {
        if(str[i] >= '0' && str[i] <= '9')
        {
            res = res * 10 + str[i] - '0';
            if(flag && res > INT_MAX)
            {
                return INT_MAX;
            }
            else if(!flag && -res < INT_MIN)
            {
                return INT_MIN;
            }
        }
        else
        {
            return flag ? res : -res;
        }
    }

    return flag ? res : -res;
}
原文地址:https://www.cnblogs.com/ddddddwwwxx/p/5527211.html