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

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入描述:

输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0
示例1

输入

复制
+2147483647
    1a33

输出

复制
2147483647
    0

先介绍一下atoi函数:

用来把一个字符串转换成一个整数,例如:输入字符串“123”,输出数字123

思路:
此题最关键是要考虑到很多临界情况:

1、考虑是否是空字符串,空字符串不合法,返回0

2、考虑字符串是否合法,不合法,返回0

3、最大数问题,超过最大值,返回0

4、不合法情况下返回0,要与正常值返回0,作区分

5、只有正负号情况是合法的。

代码:

class Solution {
public:
    int flag=true;//判断是正常返回的零,还是因为非法输入返回的零
    int sys=0;//0代表是正数,1代表是负数
    int StrToInt(string str) {
        //语法: const char *c_str();
       // c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 
        //如果不用此函数只能用下标法,不能用str直接str++,或者str--
        const char* digit=str.c_str();
        //考虑字符串是否为空,并做标记
        int n=str.size();
        if(n==0)
        {
         flag=false;
         return 0;
        }
        long long num=0;
        //考虑是否有正负号,并为负号做标记,并考虑只有正负号的输入,返回零(合法输入)
        if(*digit=='+')
          digit++;
        else if(*digit=='-')
        { sys=1;
          digit++;
        }
        //将字符串转化为数字,并检查中间是否有非法字符(不在0~9之间的字符)
        while(*digit!='\0')
        {
            if(*digit>='0'&&*digit<='9')
            {   int minus=(sys==1)?-1:1;//判断是正值还是负值
                num=num*10+minus*(*digit-'0');
                //判断大数问题(最大的正整数与最小的负整数)
                if(num>0x7FFFFFFF||num<(signed int)0x80000000)
                { 
                   num=0;
                   break;
                }
                digit++;
            }
            else
            {
                flag=false;
               return 0;
            }
        }
       return num;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41413441/article/details/80735739