#include<iostream>
#include <stdio.h>
#include <stack>
#include <string>
#include <vector>
#include <math.h>
#include <limits.h>
using namespace std;
bool invalid_input = false;
long long aoti_core(const string& str, int end, int start) {
long long str2int = 0;
for (int i = end; i >= start; i--) {
// size_t
if (str[i] - '0' >= 0 && str[i] - '0' <= 9) {
str2int += (str[i] - '0') * pow(10, str.length()-1-i);
}
else {
invalid_input = true;
return -1;
}
}
return str2int;
}
int atoi_fuc(const string& str) {
long long str2int = 0;
if (str.length() == 1) {
if (str[0] - '0' < 0 || str[0] - '0' > 9 ) {
invalid_input = true;
return -1;
}
}
else {
if (str[0] == '-') {
str2int = aoti_core(str, str.length()-1, 1);
if (!invalid_input) {
if (0-str2int < INT_MIN) {
throw("invalid int");
}
}
return (int) (0-str2int);
}
else if (str[0] == '+') {
str2int = aoti_core(str, str.length()-1, 1);
if (!invalid_input) {
if (str2int > INT_MAX) {
throw("invalid int");
}
}
return (int) str2int;
}
else {
str2int = aoti_core(str, str.length()-1, 0);
if (!invalid_input) {
if (str2int > INT_MAX) {
throw("invalid int");
}
}
return (int) str2int;
}
}
return (int) str2int;
}
int main()
{
const string str = "+01212";
// 边界处理
// 1、单一字符
// 2、输入非法数字
// 3、负数
// 4、"+11212" 也是一个有效输入
// 5、大于int 类型最大值;或小于 int类型最小值
int str2int = atoi_fuc(str);
cout << str2int << endl;
return 0;
}