出现的问题:
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;
}