码迷,mamicode.com
首页 > 编程语言 > 详细

字符串转化为整数的算法改进及优化

时间:2016-01-26 01:50:35      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:c语言 函数   字符串

我们知道C语言有一个库函数atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数。那么如何实现这个函数呢?

很多同学很快会写出下列代码:

int StrtoInt(char str[])
{
	assert(str);
	int num=0;
	while(*str)
	{
		num=num*10+*str-‘0‘;
		++str;
	}
	return num;
}

这个代码有没有什么漏洞呢?虽然用了assert来检查了空指针,但是,试想一下,如果我们传进去的字符串是一个有符号的数呢?正整数的加号可以省略,但是负数呢?是不是还应该再修改一下。此外,我们传进去的字符串是不能修改的吧。该用const修饰吧。考虑正负数的问题,我们将程序中加入一个flag标志位用来记录正负数。改进程序如下:

int StrtoInt( const char str[])
{
	assert(str);
	int num=0;
	int flag=1;
	if(*str==‘+‘)
	{
		str++;
	}
	else if(*str==‘-‘)
	{
		flag=-1;
		str++;
	}
	while(*str)
        {
		num=num*10+*str-‘0‘;
		str++;
	}
	return flag*num;
}

接下来,我们是不是要考虑在开始的时候检查一下非法输入呢?检查非法输入外,是不是还要考虑一下溢出问题呢?这些都是一名优秀的编程人员考虑范围。下面让我们来参考一下《剑指offer》这本书中对这个问题的解答吧!

参考代码如下:

long long StrToIntCore(const char* str, bool minus);

enum Status {kValid = 0, kInvalid};
int g_nStatus = kValid;

int StrToInt(const char* str)
{
    g_nStatus = kInvalid;
    long long num = 0;

    if(str != NULL && *str != ‘\0‘) 
    {
        bool minus = false;
        if(*str == ‘+‘)
            str ++;
        else if(*str == ‘-‘) 
        {
            str ++;
            minus = true;
        }

        if(*str != ‘\0‘) 
        {
            num = StrToIntCore(str, minus);
        }
    }

    return (int)num;
}

long long StrToIntCore(const char* digit, bool minus)
{
    long long num = 0;

    while(*digit != ‘\0‘) 
    {
        if(*digit >= ‘0‘ && *digit <= ‘9‘) 
        {
            int flag = minus ? -1 : 1;
            num = num * 10 + flag * (*digit - ‘0‘);

            if((!minus && num > 0x7FFFFFFF) 
                || (minus && num < (signed int)0x80000000))
            {
                num = 0;
                break;
            }

            digit++;
        }
        else 
        {
            num = 0;
            break;
        }
    }

    if(*digit == ‘\0‘) 
    {
        g_nStatus = kValid;
    }

    return num;
}

一个简单的问题在经过仔细考虑之后可以写出如此长的代码,这个例子对我们还是一个警示,对可能出现的情况都要考虑到,减少BUG。希望带给初学者一些帮助。

本文出自 “柠公子” 博客,转载请与作者联系!

字符串转化为整数的算法改进及优化

标签:c语言 函数   字符串

原文地址:http://luminous.blog.51cto.com/10797288/1738434

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!