题目描述
输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。
给定函数原型int StrToInt(const char *str)
,实现字符串转换成整数的功能,不能使用库函数atoi。
注意一下几点:
- 空指针输入:输入的是指针,在访问空指针时程序会崩溃,因此在使用指针之前需要先判断指针是否为空。
- 正负符号:整数不仅包含数字,还有可能是以'+'或'-'开头表示正负整数,因此如果第一个字符是'-'号,则要把得到的整数转换成负整数。
- 非法字符:输入的字符串中可能含有不是数字的字符。因此,每当碰到这些非法的字符,程序应停止转换。
- 整型溢出:输入的数字是以字符串的形式输入,因此输入一个很长的字符串将可能导致溢出。
完整参考代码如下:(溢出可以使用long long类型或者不用也可以)
int strtoint(char *str) { int MAX_INT = (unsigned)~0 >> 1; int MIN_INT = -((unsigned)~0 >> 1) - 1; int sign = 1; int res = 0; if(str == 0) { return 0; } while(isspace(*str)) { ++str; } if(*str == '-') { sign = false; ++str; } else if(*str == '+') { ++str; } while(isdigit(*str)) { int temp = *str - '0'; if(sign && (res > MAX_INT / 10 || res == MAX_INT / 10 && temp > MAX_INT % 10)) { return MAX_INT; } if(!sign && (res > (unsigned)MIN_INT / 10 || res == (unsigned)MIN_INT / 10 && temp > (unsigned)MIN_INT % 10)) { return MIN_INT; } res = res * 10 + temp; ++str; } return sign ? res : -res; }
int myAtoi(string str) { long long res = 0; int i = 0; bool flag = true; while(str[i] == ' ') { ++i; } if(str[i] == '-') { flag = false; ++i; } else if(str[i] == '+') { flag = true; ++i; } int temp = 0; for(; i < str.size(); ++i) { if(str[i] >= '0' && str[i] <= '9') { res = res * 10 + str[i] - '0'; if(flag && res > INT_MAX) { return INT_MAX; } else if(!flag && -res < INT_MIN) { return INT_MIN; } } else { return flag ? res : -res; } } return flag ? res : -res; }