首先根据位数初步判断待转换的数是否超过int数据类型的表示范围,接着用long long类型承载待转换的数,判断是否超过int数据类型的范围,最后将long long类型变量承载的数赋值给int类型的变量。这里编译器会发出警告,“warning C4244: “=”: 从“__int64”转换到“int”,可能丢失数据”,暂时忽略,以后继续研究。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<iostream>
#include<string>
#include<cctype>
using namespace std;
class Solution {
public:
int myAtoi(string str) {
string::iterator iter1;
for(iter1 = str.begin(); iter1 != str.end(); ) {
if(isspace(*iter1) == false)
break;
iter1++;
}
if(iter1 == str.end()) {
//cout << "no non-whitespace sequence" << endl;
//getchar();
return 0;
}
string::iterator iter2;
iter2 = iter1 + 1;
if(*iter1 == '-' || *iter1 == '+') {
if(isdigit(*iter2) == 0) {
//cout << "no valid sequence" << endl;
//getchar();
return 0;
}
}else if(isdigit(*iter1) != 0) {
} else {
//cout << "no valid sequence" << endl;
//getchar();
return 0;
}
string::iterator itertmp1;
int counter = 0;
for(itertmp1 = iter1; itertmp1 != str.end();) {
if(itertmp1 == iter1) {
if(isdigit(*itertmp1) == 0){
} else {
counter++;
}
itertmp1++;
if(isdigit(*itertmp1) == 0)
break;
}else {
counter++;
itertmp1++;
if(isdigit(*itertmp1) == 0)
break;
}
}
char *chararr = new char[counter + 1];
if(*iter1 == '-')
chararr[0] = '-';
else
chararr[0] = '+';
string::iterator itertmp2;
int tmp;
itertmp2 = iter1;
tmp = 1;
for(; tmp <= counter; ) {
if(itertmp2 == iter1) {
if(isdigit(*itertmp2) != 0) {
chararr[tmp] = *itertmp2;
tmp++;
itertmp2++;
}else
itertmp2++;
}else {
chararr[tmp] = *itertmp2;
tmp++;
itertmp2++;
}
}
if(counter > 10)
if(chararr[0] == '-') {
//cout << "exceed negative bound" << endl;
//getchar();
return -2147483648;
}else {
//cout << "exceed optive bound" << endl;
//getchar();
return 2147483647;
}
long long bufferLongInt = 0;
int i;
int result;
int weight = 1;
for(i = counter;i >= 1; i--) {
bufferLongInt += (chararr[i] - 48) * weight;
weight *= 10;
}
if(chararr[0] == '-')
if(bufferLongInt > 2147483648) {
//cout << "exceed negative bound" << endl;
//getchar();
return -2147483648;
}else {
result = -bufferLongInt;
//cout << result << endl;
//getchar();
return result;
}
else
if(bufferLongInt > 2147483647) {
//cout << "exceed optive bound" << endl;
//getchar();
return 2147483647;
}else {
result = bufferLongInt;
//cout << result << endl;
//getchar();
return result;
}
}
};
int main() {
string str = " 2147483648%#134 ";
Solution solution;
cout << solution.myAtoi(str) << endl;
getchar();
}</span>