OJ_3_把字符串转换为数字

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

输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0

溢出判断是难点;

符号的判断;

空字符串;

//+-只能出现在开头,如果没有+-,默认为正数;
//此外如果有非数字,则直接返回0;

 1 class Solution {
 2 public:
 3     int StrToInt(string str) {
 4         int flag = 1;
 5         int res = 0;
 6         int temp;
 7         if(str.length()==0)   //空字符串
 8             return 0;
 9         if(str[0]=='-')
10             flag = -1;
11         for(int i = 0; i<str.length(); i++)
12         {
13             if(str[i]<'0' || str[i]>'9'){ //非数字
14                 if(i==0 && (str[i]=='+' || str[i]=='-')){  //只允许i=0出现+或者-
15                     continue;
16                 }
17                 else{
18                     return 0;
19                 }
20             }
21             else{
22                 //int 十进制:-2^31=-21 4748 3648 到 2^31-1=21 4748 3647。共10位,21亿。
23                 int digit = (int)(str[i]-'0');
24                 temp = res*10 + digit;
25                 //注意还要判断res*10是否溢出 ,之后再判断加上digit是否溢出
26                 //向上溢出判断 INT32_MAX < res*10 + digit
27                 if(flag == 1 && (res>INT32_MAX/10 || res*10 > INT32_MAX-digit))  
28                     return 0;
29                 //向下溢出判断 INT32_MIN > res*10*(-1) - digit
30                 if(flag == -1 && (res*flag<INT32_MIN/10 || res*10*flag < INT32_MIN+digit))  
31                     return 0;
32                 res = temp;
33             }
34 
35         }
36         return flag*res;
37     }
38 };

猜你喜欢

转载自www.cnblogs.com/grooovvve/p/12364712.html