数据结构学习笔记3-字符串转换成整数

本文参考了《字符串转换成整数》

题目描述

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

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

分析与解法

本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数。那如何实现把表示整数的字符串正确地转换成整数呢?以”123”作为例子:

1.当我们扫描到字符串的第一个字符’1’时,由于我们知道这是第一位,所以得到数字1。
2.当扫描到第二个数字’2’时,而之前我们知道前面有一个1,所以便在后面加上一个数字2,那前面的1相当于10,因此得到数字:1*10+2=12。
3.继续扫描到字符’3’,’3’的前面已经有了12,由于前面的12相当于120,加上后面扫描到的3,最终得到的数是:12*10+3=123。

完整代码如下:(与参考网址不同)

#include<stdio.h>
#include<string.h>

#define MAX_INT 4294967295  //不考虑正负,所以2的32次方就是这个值
int StrToInt(const char * str)
{
    int i;
    int sum=0;
    int multiple=1;
    if(str==NULL)//如果指针是空,则异常退出;
        return -1;

    for(i=0;i<=strlen(str)-1;i++)
        {   
            printf("the (int)str[i]-48 is %d and the sum is %d\n",str[i]-48,sum);           
            if(sum>(MAX_INT/10) || (( sum==MAX_INT/10) && (str[i]-48)>(MAX_INT%10)))
                {
                    return -2;//代表超出int 的表示范围了;
                }

            sum=sum*multiple+(str[i]-48);
            multiple=10;
        }
    return sum;
}

int main()
{
    int calsum=0;
    char *str1="4294";
    calsum=StrToInt(str1);
    printf("%d\n",calsum);
    return 0;
}

重点:(参考网址的内容)

一直以来,我们努力的目的归根结底是为了更好的处理溢出,但上述第二种处理方式考虑到直接计算n * 10 + c 可能会大于MAX_INT导致溢出,那么便两边同时除以10,只比较n和MAX_INT / 10的大小,从而巧妙的规避了计算n*10这一乘法步骤,转换成计算除法MAX_INT/10代替,不能不说此法颇妙。

参考网址:
《字符串转换成整数》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值