算法练习-字符串转换成整数(实现atoi函数)

时间:2023-01-03 19:06:47

练习问题来源

https://leetcode.com/problems/string-to-integer-atoi/

https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/01.03.html

要求:

输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。

给定函数原型int StrToInt(const char *str) ,实现字符串转换成整数的功能,不能使用库函数atoi。

解法:

 1 // ================字符串转换成整数==================
 2 // 题目描述:
 3 // 输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123
 4 //给定函数原型int StrToInt(const char *str) ,实现字符串转换成整数的功能,不能使用库函数atoi
 5 
 6 // 需要考虑以下几点:
 7 // 空指针输入:输入的是指针,在访问空指针时程序会崩溃,因此在使用指针之前需要先判断指针是否为空。
 8 // 正负符号:整数不仅包含数字,还有可能是以'+'或'-'开头表示正负整数,因此如果第一个字符是'-'号,则要把得到的整数转换成负整数。
 9 // 非法字符:输入的字符串中可能含有不是数字的字符。因此,每当碰到这些非法的字符,程序应停止转换。
10 // 整型溢出:输入的数字是以字符串的形式输入,因此输入一个很长的字符串将可能导致溢出
11 int StrToInt(const char *str)
12 {
13     static const int MAX_INT = (int)((unsigned)~0 >> 1);
14     static const int MIN_INT = -(int)((unsigned)~0 >> 1) - 1;
15     unsigned int n = 0;
16 
17     // 判断输入是否为空
18     if(0 == str)
19     {
20         return 0;
21     }
22 
23     // 处理空格
24     while (' ' == *str)
25         ++str;
26 
27     // 处理正负
28     int sign = 1;
29     if('+' == *str || '-' == *str)
30     {
31         if(*str == '-')
32             sign = -1;
33         ++str;
34     }
35 
36     // 检测之后的所有字符是否为 0~9
37     const char *strDetect = str;
38     if (*strDetect <= '0' || *strDetect > '9')
39     {
40         return 0;
41     }
42     else
43     {
44         ++strDetect;
45         while((*strDetect >= '0' && *strDetect <= '9') && ('\0' != *strDetect))
46         {
47             ++strDetect;
48         }
49         if('\0' != *strDetect)
50             return 0;
51     }
52 
53     while (*str >= '0' && *str <= '9')
54     {
55         // 处理溢出
56         int c = *str - '0';
57         if(sign > 0 && (n > MAX_INT / 10 || (n == MAX_INT / 10 && MAX_INT %10)))
58         {
59             n = MAX_INT;
60             break;
61         }
62         else if (sign < 0 && (n > (unsigned)MIN_INT / 10 || 
63             (n == (unsigned)MIN_INT /10 && (unsigned)MIN_INT % 10)))
64         {
65             n = MIN_INT;
66             break;
67         }
68 
69         // 把之前得到的数字乘以10,再加上当前字符表示的数字
70         n = n * 10 + c;
71         ++str;
72     }
73 
74     return sign > 0 ? n : -n;
75 }