C++将字符串转换为整数

考虑空字符串、正负号、字符串前中后有空格、上溢下溢等

#include<map>
#include<string>
#include<vector>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<stack>
using namespace std;

static bool kIsVaild = true;  //用于判断输入的字符是否非法 默认合法

class Solution {
public:
	int stringToInteger(string str) {
		long long  num = 0;
		if (str.empty()) {
			kIsVaild = false;
			return 0; //字符串为空 非法返回0
		}
		int len = str.length();
		bool minus = false; //用于标示是正号还是负号

		//去除字符串前部的空格
		int i = 0;
		for (; i < len; i++) {
			if (str[i] != ' ')
				break;
		}

		//判断是否有负号位
		if ((str[i] < '0' || str[i] > '9') && (str[i] != '+' && str[i] != '-')) {
			kIsVaild = false;
			return 0;//非法字符返回
		}
		else if (str[i] == '+') {
			i++;
		}
		else if(str[i] == '-'){
			minus = true;
			i++;
			
		}

		//开始遍历有效数字部分 123abc
		int j = i;
		while(j < len) {
			if (str[j] >= '0' && str[j] <= '9') {
				num = num * 10 + str[j] - '0';
				if (!minus && num > 0x7FFFFFFF) { //num上溢
					kIsVaild = false;
					num = 0x7FFFFFFF;
					break;
				}
				if (minus && num > 0x80000000) { //num下溢
					kIsVaild = false;
					num = int(0x80000000);
					break;
				}
				j++;
			}
			else if (str[j] == ' ')
				j++;
			else { //遇到非法字符
				num = 0;
				kIsVaild = false;
				break;
			}
		}
		num = minus ? -num : num;  
		return (int)num;
		
	}
};

//测试用例:
//字符串为空
//前面有空格,  "  123"
//含有正号或负号: "+123" "-123"
//非法输入 "abcd"
//字符串中间或后面有空格:"12 12 12 "
//正整数溢出  > 0x7FFFFFFF
//负整数溢出  < 0x80000000

int main() {

	string line;

	while (getline(cin, line)) {
		int answer = Solution().stringToInteger(line);
		cout << (kIsVaild ? "有效   " : "无效   ") << answer << endl;
	}

	system("pause");
	return 0;
}



原文链接: https://www.cnblogs.com/ccpang/p/12758490.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++将字符串转换为整数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/196444

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午7:15
下一篇 2023年2月12日 下午7:15

相关推荐