我的string_to_integer函数

  在做leetcode的时候,又遇到这个百提不爽的问题,当时拿过题来,感觉那些情况我都知道的,然后就开始写。结果,还是很多没有注意到的,提交好几次才accept了,在此记录下,也与大家共享。

  考虑情况:

    1. 首先,传入指针是否为空
    2. 字符串是否为空
    3. 包含+、-符号【但仅包含+、-为非法的】
    4. 是否会溢出(超出int表示范围)
    5. 是否包含非法字符【输出为可转换的还是输出0或者其他要看题意!由isLegal控制】          
    6. 忽略最前面的空格

  

#include "stdafx.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 bool isLegal = true;
 7 
 8 class Solution
 9 {
10 public:
11     int atoi(const char *str)
12     {
13         int  sum = 0;//空串返0
14         const char *p = str;
15         bool isNegative = false;//是否为负数
16         //或者设为int sign = 1;为负时设为-1,返回sign*sum
17         if(str == NULL)
18         {
19             isLegal = false;
20             return 0;
21         }
22         //先过滤掉空格!!!
23         while(*p==' '&&*p!='')//!!!
24             p++;
25 
26         if(*p == '+')
27         {
28             //仅有“ +”不合法!!!
29             p++;
30             if(*p == '')
31             {
32                 isLegal = false;
33                 return 0;
34             }
35         }
36         else
37         {
38             if(*p == '-')
39             {
40                 //仅有“ -”不合法!!!
41                 isNegative = true;
42                 p++;
43                 if(*p == '')
44                 {
45                     isLegal = false;
46                     return 0;
47                 }
48             }
49         }
50 
51         while(*p != '')
52         {
53             if(*p>='0' && *p<='9')
54             {
55                 
56                 //计算之前判断:不在int表示范围内!!!
57                 if(!isNegative)
58                 {
59                     if(sum>0x7fffffff/10 ||( sum==0x7fffffff/10 && (*p-'0') >= 0x7fffffff%10))
60                         return 0x7fffffff;//最大最小值表示法!!!
61                 }
62                 else
63                 {
64                     if(sum>0x80000000/10 ||( sum==0x80000000/10 && (*p-'0') >= 0x80000000%10))
65                         return (int)0x80000000;//最大最小值表示法!!!(0x不要漏掉了!!)
66                 }
67 
68                 sum = sum*10+(*p-'0');
69 
70                 //    else
71                 //        sum = sum + (*p-'0')*0.1;//计算方式不对!!
72             }
73             else
74             {
               isLegal = false;//表示含非法字符
75                 break;//!!!返回可转换部分
76             }
77             p++;
78         }
79 
80 
81         return isNegative ? -sum : sum;
82     }
83 
84 };
85 
86 int main()
87 {
88     Solution sol;
89     cout << sol.atoi("-2147483647")<<endl;
90     //“-123”,“”,NULL,“  213”,超过范围,“+”
91     //不规则输入,但是有效:“-3924x8fc”、“+413”
92     //边界:“-2147483647”“-2147483648”“2147483647”
93     //无效格式:“++c”、“++1”
94     //溢出数据“2147483648”“9223372036854775809”
95 
96 }

  

 

原文地址:https://www.cnblogs.com/dreamrun/p/4381135.html