剑指offer—字符串转换整数

对于这个问题,
本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数。那如何实现把表示整数的字符串正确地转换成整数呢?以”345”作为例子:
当我们扫描到字符串的第一个字符’3’时,由于我们知道这是第一位,所以得到数字3。
当扫描到第二个数字’4’时,而之前我们知道前面有一个3,所以便在后面加上一个数字4,那前面的3相当于30,因此得到数字:3*10+4=34。
继续扫描到字符’5’,’5’的前面已经有了34,由于前面的34相当于340,加上后面扫描到的5,最终得到的数是:34*10+5=345。
因此,此题的思路便是:每扫描到一个字符,我们便把在之前得到的数字乘以10,然后再加上当前字符表示的数字。

需要注意的问题:“由于整数可能不仅仅之含有数字,还有可能以’+’或者’-‘开头,表示整数的正负。因此我们需要把这个字符串的第一个字符做特殊处理。如果第一个字符是’+’号,则不需要做任何操作;如果第一个字符是’-‘号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。
接着我们试着处理非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将不可避免地导致程序崩溃。
另外,输入的字符串中可能含有不是数字的字符。每当碰到这些非法的字符,我们就没有必要再继续转换。
最后一个需要考虑的问题是溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。”
其实最先开始我是采用循环的方式进行的,

int StrToInt(char *str)
{
    int number=0;
    while(*str!=0)
    {
        number=number*10+*str-'0';
        str++;
    }
    return number;
}

这是最初的一个想法,在我们遇到这个情况了以后,我们作为编程的人,应该考虑各种边界测试,各种的异常状况!!!

比如上面这个程序,如果我们的字符串所需要输出的是带+123456或者是带-132456?那么是否还会正常的输出呢?还有,如果我所给的字符串为空字符串呢?

所以考虑多种情况:
我们写出下面的代码:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
long long transform(char *str)
{
    int flag = 1;
    int num = 0;
    int radix = 0;
    //判断空字符串
    if (str == NULL)
    {
        return 0;
    }
    //判断空格问题
    while (isspace(*str))
    {
        str++;
    }

    //-情况
    if (*str == '-')
    {
        flag = -1;
        str++;
    }
    //+情况
    else if (*str=='+')
    {
        str++;
    }

    //考虑进制的问题
    if (*str == '0' && (*(str + 1) == 'X' || *(str + 1) == 'x'))//十六进制
    {
        radix = 16;
        str += 2;
    }else if(*str == '0')//八进制
    {
        radix  = 8;
        str++;
    }else //十进制
    {
        radix = 10;
    }
    while (*str)
    {
        if (radix == 16)
        {
            if (*str >= '0' && *str < '9')
            {
                num = num*radix + (*str - '0');//处理十六进制0-9
            }
            else
            {
                num = num*radix + (*str - 'a' + 10);//处理a-f
            }
        }
        else
        {
            num = num*radix + (*str - '0');
        }
        str++;
    }
    return num*flag;
}
int main()
{

    char *str = "45678";
    long long ret = 0;
    ret=transform(str);
    printf("%ld", ret);
    system("pause");
    return 0;
}

在这里我扩展了下功能,可以使得程序进行8进制,16进制还有10进制的转换,在这里我们得到的提示是,在编程中,要有良好的编程习惯,全面进行考虑。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值