【剑指offer】把字符串转换成整数

题目描述:
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例:

输入:
+2147483647
    1a33
输出:
2147483647
    0

首先,写代码之前先考虑所有可能的测试用例的习惯,在这个题上,我分析有以下几种输入:

  1. 空指针,即传入的指针 str==NULL;
  2. 指针为空,即传入的字符串为空字符串,str="";
  3. 数字,123456
  4. +、-,出现在第一位时代表数字的正负,后面出现视为非法输入
  5. 字母等其他非法输入

其次,需要考虑范围的问题,正整数的最大值为0x7FFFFFFF,最小的负数是0x80000000,分两种情况判断整数是否发生上溢出或者下溢出。
下面是实现代码:

class Solution {
public:
    int StrToInt(string str) {
        
	//1.空指针 str==NULL
	//2.指针为空	str="";
	//3.非法输入	符号、字母、两个符号+-
	//4.直接为数字,没有符号
    int len=str.length();
    if(len==0)
        return 0;
    int i=0;
    int num = 0;
    int flag = true;
    while(str[i]==' ')
    {
        i++;
    }
	//判断第一个字符的类型
	if (str[i] == '+')	//第一位为+
	{
		i++;
	}
	else if (str[i] == '-')	//第一位为-
	{
		i++;
        flag *= false;
	}
	while(str[i] != '\0')	//如果没有到字符串结尾
	{
		if (str[i] >= '0' && str[i] <= '9')
		{
			int tmp = flag ? 1 : -1;
			num = num * 10 + tmp*(str[i] - '0');

			//整数超出范围
			if ((!flag && num > 0x7FFFFFFF) || (flag && num < (signed int)0x80000000))
			{
				num = 0;
				break;
			}
			i++;
		}
		else
		{
			num = 0;
			break;
		}
	}
	return num;
    }
};

猜你喜欢

转载自blog.csdn.net/lvxin15353715790/article/details/83791940