把字符串转换成整数

时间:2023-01-03 21:53:51

把字符串转换成整数

把字符串转换成整数

功能测试:输入的字符字符串表示正数、负数、0;

边界值:最大正整数,最小负整数

特殊输入测试:输入字符串为NULL指针,空字符串、字符串中有非数字字符...

 1 class Solution {
 2 public:
 3     enum Status{kValid = 0,kInvalid};
 4     int g_nStatus = kValid;//标记是否是非法输入
 5     int StrToInt(string str) {
 6         g_nStatus = kInvalid;////初始标记为非法输入
 7         long long num=0;//存出结果的
 8         const char* cstr=str.c_str();//变成标准c字符数组,最后一个元素是'\0'
 9         //判断是是否是空指针和空字符串
10         if(cstr!=nullptr && *cstr!='\0'){
11             //先处理符号位
12             int minus=1;
13             if(*cstr=='-'){
14                 minus=-1;
15                 cstr++;
16             }
17             else if(*cstr == '+') cstr++;
18             //开始处理其余的位
19             while(*cstr!='\0'){
20                 //注意'\0'==0,‘ ’==32,'0'==48,‘A’==65,‘a’==97字符的比较用的是ascii码
21                 if(*cstr>'0' && *cstr<='9'){
22                     g_nStatus = kValid;
23                     num = num*10 + (*cstr - '0');
24                     cstr++;
25                     //数据溢出
26                     //如果是整数,num>int最大的数时;或负数,小于int最小的数时
27                     //一个16进制数可以有4位二进制来表示,也就是4bit,那么8位16进制数由32位二进制表示
28                     //正好是int型的大小,第一个是7=0111,也即是第一位是0后面全是1
29                     if(((minus>0) && (num > 0x7FFFFFFF))||((minus<0) && (num > 0x80000000))){
30                         g_nStatus = kInvalid;
31                         num=0;
32                         break;
33                     }
34                 }
35                 else{
36                     g_nStatus = kInvalid;
37                     num=0;
38                     break;
39                 }
40             }
41             if(g_nStatus==kValid) num=num*minus;
42         }
43         return (int)num;
44     }
45 };