String to Integer (atoi)

首先根据位数初步判断待转换的数是否超过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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值