要求:
1.将字符串s转为整数并返回,即:s = "123456",输出:123456
2.前面有空格时,忽略,即:s = " 123",输出:123
3.前面的数字为0时,忽略,即:s = "00000123",输出:123
4.从第一个非空格字符开始,非数字字符结束。不是数字均输出0,即:
(1)s = " -00000123",输出:-123
(2)s = " 00+000123",输出:0
(3)s = " +123gr",输出:123
(4)s = " adw -123gr",输出:0
整型数据范围:2^31~2^31-1(-2147483648~2147483647)
代码:
//字符串转换整数
int myAtoi(char* s)
{
//参数检测
if (s == NULL)
return 0;
//去除多余空格
int i = 0;
while (s[i] == ' ')
i++;
//负数标志
int flag = 1;
//第一个非空格字符判断
if (s[i] == '+')
i++;
else if (s[i] == '-')
{
i++;
flag = -1;
}
else if (s[i] < '0' || s[i] > '9')
return 0;
//整数边界值
const int maxInt = 2147483647;
const int minInt = -2147483647 – 1;
//字符转化数字
int result = 0;
while (s[i] >= '0' && s[i] <= '9' && s[i] != '\\0')
{
//溢出判断
if (flag == 1)
{
if (result > maxInt / 10 || result == maxInt / 10 && s[i] – '0' >= 7 || result / 1000000000 > 0)
return maxInt;
}
if (flag == -1)
{
if (result > maxInt / 10 || result == maxInt / 10 && s[i] – '0' >= 8 || result / 1000000000 > 0)
return minInt;
}
result *= 10;
result += s[i] – '0';
i++;
}
return result * flag;
}
思路:
首先,进行参数检测,并将指针i移至第一个不为空格字符的位置。
此时,对此字符判断,只要不是以正负号和数字开头均返回0;为正负号,指针i向后移动1位;且给定正负数标记flag。
接着,遍历字符串直到出现非数字字符或者字符串结束,按位转化数字字符为对应的数字,转化方法也很简单,用数字字符减去字符0即可得到它对应的数字。
然后,考虑到整型数据的边界问题,定义整型数据边界值minInt和maxInt,判断溢出有3种情况:
(1)当前数据result大于边界的十分之一,由于此次循环会再给result乘10,溢出;
(2)当前数据result等于边界的十分之一,此时再判断最后一位是否溢出;
(3)当前数据result为10位数,由于此次循环会再给result乘10,溢出。
最后,给返回结果result加上正负号flag并返回。
语句解释:
(1)const int minInt = -2147483647 – 1,之所以不直接写-2147483648,是因为再vs编译器上会将2147483648识别为无符号整型,无法在前面加负号。
(2)result / 1000000000 > 0,这里是在判断result是否为10位数,用它除以最小的10位数。
评论前必须登录!
注册