云计算百科
云计算领域专业知识百科平台

【C语言】【字符串】字符串转整型myAtoi函数实现

要求:

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位数。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【C语言】【字符串】字符串转整型myAtoi函数实现
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!