8. String to Integer (atoi)

来源:互联网 发布:js 闪动效果 编辑:程序博客网 时间:2024/06/08 08:47

出现的问题:
1.不是输出数字而是返回数字
2.遇到正负号不break
3.字符‘0’-‘9’的对应的整型范围是48-58
4.string类型的length是个函数而不是一个变量所以要用str.length()
5.最后输出的时候可以和*10再加下一位
6.例如“ +0 123”也要返回0

自己的代码(40ms):

#include "stdafx.h"#include<iostream>#include<string>#include<vector>#include<math.h>using namespace std;int main(){    string str;    vector<int> jishu;    cin >> str;    int flag = 0, count = 0,sym = 0 ;    int result = 0;    for (int i = 0; i < str.length(); i++)    {        if (str[i] >= 48 && str[i] < 59)        {            //cout << int(a[i] - '0') << endl;            /*if (sym == 1)            {                jishu.push_back(-int(str[i] - '0'));                sym = 0;            }            else */            jishu.push_back(int(str[i] - '0'));            flag = 1;        }        else if (str[i] == 45&&flag!=1)        {            if (sym != 0)                break;            sym = 1;            flag = 1;        }        else if (str[i] == 43 && flag != 1)        {            if (sym != 0)                break;            sym = 2;            flag = 1;        }        else if (str[i] == ' '&& flag != 1)        {            continue;        }        else         {            break;        }    }    for (int i = 0; i < jishu.size(); i++)    {        /*if (jishu[i] < 0)        {               jishu[i] = -jishu[i];            result += jishu[i] * pow(10, count);            result = -result;        }        else*/        result = count*10+jishu[i];        if (result / 10 != count)        {            if (sym == 1)                return INT_MIN;            else                return INT_MAX;        }        count = result;    }    if (sym == 1)        result = -result;    cout << result;    getchar();    return 0;}

大牛写的代码分析:

int atoi(const char *str) {    int sign = 1, base = 0, i = 0;    //除去字符串前面的空格    while (str[i] == ' ') { i++; }     //当遇到字符为'-'时,则sign为-1,否则为1    if (str[i] == '-' || str[i] == '+') {        sign = 1 - 2 * (str[i++] == '-');     }    //当符号后(或者无符号)遇到字符为数字的时候进行转换    //若先遇到非符号或者非数字的情况的时候,则直接返回0    while (str[i] >= '0' && str[i] <= '9') {    //1.若在加上最后一位之前的数大于了INT_MAX/10,则说明加上最后一位后一定会溢出,而atoi的函数功能是当遇到最大溢出    //的时候则输出最大值就可以,所以直接根据符号进行return最大和最少值即可。    //2.若加上最后一位之前的数等于INT_MAX/10,则加上最后一位有可能不会溢出,则这时候需要进行判断,由于int最大值为    //2147483647,则最后一位大于7则溢出,操作同上        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {            if (sign == 1) return INT_MAX;            else return INT_MIN;        }        base  = 10 * base + (str[i++] - '0');    }    return base * sign;}
0 0
原创粉丝点击