字符串--6-字符串转整数

题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

要点:

    运用string的库函数进行string与int之间的互相转换
    string str("skdafj");

    int a = stoi(str.c_str());

    string b = to_string(a);


本题思路

  • 指针是否为空指针以及字符串是否为空字符串;
  • 字符串对于正负号的处理;
  • 输入值是否为合法值,即小于等于'9',大于等于'0';
  • int为32位,需要判断是否溢出;
  • 数字前面出现多个正负号,则判错,返回0,如“++123”,“--123”,“+-123”,“-+123”
    连续的数字被其他符号隔开,则返回0,如“   123a321”,"   123    123",都是返回0
    如果超出了int范围(-2147483648--2147483647),返回临界最大值,也就是说如果是负数返回-2147483648,整数则返回2147483647

#include <iostream>
#include <string>
using namespace std;

//运用string的库函数进行string与int之间的互相转换
//string str("skdafj");
//int a = stoi(str.c_str());
//string b = to_string(a);

class Solution {
public:
	int my_stoi(string &str)
	{
		long long num = 0;
		bool flag = true;						//正负标志,整数默认为true,负数为false
												//转换为c_str()  末位为'\0'
		const char * cstr = str.c_str();
		if (cstr != NULL && *cstr != '\0')
		{
			if (*cstr == '+')
			{
				cstr++;
			}
			else if (*cstr == '-')
			{
				flag = false;
				cstr++;
			}
			if (*cstr != '\0')
			{
				num = strToIntCore(cstr, flag);
			}
		}
		return num;
	}
private:
	int strToIntCore(const char *cstr, int flag)
	{
		long long num = 0;
		while (*cstr != '\0')
		{
			int n = flag ? 1 : -1;
			if ('0' <= *cstr && *cstr <= '9')
			{
				num = num * 10 + n * (*cstr - '0');
				if (!n && num < (signed int)0x80000000 || n && num > 0x7FFFFFFF  )-2147483648--2147483647
				{
					num = 0;
					break;
				}
				cstr++;
			}
			else
			{
				num = 0;
				break;
			}
		}
		return num;
	}


};

int main()
{
	Solution s;
	string str;
	getline(cin, str);
	cout << s.my_stoi(str) << endl;
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/ax_hacker/article/details/80853786