字符串转化为整数

原创 2015年06月11日 00:19:35

今天做了一道简单的C语言题目,比较受打击,所以把过程记录下来,算是一个小小的教训吧。
问题描述:
实现atoi,将一个字符串转化为整数,函数原型如下:
int atoi(const char *string);

看到这个问题感觉也不难,代码如下:

int atoi(const char* string)
{
    int sign=1;
    int num=0;
    int i=0,j=strlen(string);
    while( i<j && string[i]==' ')i++;
    if(string[i]=='+')i++;
    if(string[i]=='-')
    {
        sign=-1;
        i++;
    }
    while(i<j)
    {
        if(string[i]<'0' || string[i]>'9') break;
        num=num*10+(string[i]-'0');
        if(num>=INT_MAX)
        {
            if(sign==1)
                return INT_MAX;
            else
            {
                if(num>=(INT_MAX+1))
                    return INT_MIN;
            }
        }
        i++;
    }
    return sign*num;
}

然后我满心欢喜的提交了,这是出现了一个问题。

输入:+-2
输出:-2
期望:0

稍微想了一下,立马找出错误,是自己考虑问题不全面,没有想到‘+’,‘-’号连用的情况。所以增加了一个标志,修改如下:

if(string[i]=='+')
    {
        if(flag==0)
        {   
            flag=1;
            i++;
        }
        else
            return 0;
    }
    if(string[i]=='-')
    {
        if(flag==0)
        {
            sign=-1;
            i++;
            flag=1;
        }
        else
            return 0;
    }

再一次满心欢喜的提交了,可是又报错了:

输入:-2147483647
输出:-2147483648
期望:-2147483647

这次看了一下代码,感觉没什么问题啊,逻辑上也没有错,没办法,慢慢调试吧,所以我加了如下代码:

if(num>=INT_MAX)
        {
            if(sign==1)
                return INT_MAX;
            else
            {
                if(num>=(INT_MAX+1))
                {
                    //观察输入结果
                    printf("%d %d",num,INT_MAX+1);
                    return INT_MIN;
                }
            }
        }

在num=2147483647,INT_MAX+1=2147483648的情况下竟然也进来过了,天呢,怎么可能呢,什么情况啊?难道是编译器优化了,可是优化也不至于这么荒谬吧,一边想以便调试,最后总算明白是怎么回事了,计算机在做有符号整形加减法时,正整数溢出会进入负整数区间,所以应该提早进行判断,然后在进行加法运算,这样才能得到正确的结果,所以代码修改如下:

int atoi(const char* string)
{
    int sign=1;
    int flag=0;
    int num=0;
    int i=0,j=strlen(string);
    while( i<j && string[i]==' ')i++;
    if(string[i]=='+')
    {
        if(flag==0)
        {   
            flag=1;
            i++;
        }
        else
            return 0;
    }
    if(string[i]=='-')
    {
        if(flag==0)
        {
            sign=-1;
            i++;
            flag=1;
        }
        else
            return 0;
    }
    while(i<j)
    {
        if(string[i]<'0' || string[i]>'9') break;
        if(num>INT_MAX/10 || num==INT_MAX/10 && (string[i]-'0')>INT_MAX%10) 
        {
            return sign==-1 ?INT_MIN :INT_MAX;
        }
        num=num*10+(string[i]-'0');
        i++;
    }
    return sign*num;
}

这次总算正确通过了,原来认为很简单的问题做出来后才发现有不少问题,还是自己太嫩了,继续努力吧。

附上题目链接https://leetcode.com/problems/string-to-integer-atoi/

版权声明:本文为博主原创文章,未经博主允许不得转载。

【C/C++】字符串转换成整数

考虑测试用例: 1、功能测试(输入的字符串表示正数、负数和0)。 2、边界值测试(最大的正整数和最小的负整数)。 3、特殊字符的输入(NULL、字符串中含有非法字符)。#include usin...
  • wait_hua
  • wait_hua
  • 2014年02月28日 16:03
  • 1382

面试题33:把字符串转换为整数

C语言的库函数atoi()的作用是将一个字符串转换为整数。写一个函数StrToInt,实现这一功能。...
  • htyurencaotang
  • htyurencaotang
  • 2013年09月01日 20:29
  • 5504

java实现字符串转化为整数

java实现字符串转化为整数,参考了Java函数库中的Integer.parseInt(String sting)的源码,考虑了多种情况。...
  • BrilliantEagle
  • BrilliantEagle
  • 2014年09月03日 16:28
  • 2064

【整理】C/C++中字符串与整数之间的相互转换

C/C++中字符串与整数之间的相互转换 一、用C标准库中的sprintf()和sscanf()转换  二、用C++中的stringstream类转换 三、atoi、atof、atol、itoa等 总...
  • sherry_zs
  • sherry_zs
  • 2016年01月13日 20:23
  • 2563

C语言将字符串转为整数

1、C语言有atoi、atol、atof等库函数,可分别把ASCII编码的字符串转化为int、long、float类型的数字。需要注意的是,这个几个函数是C语言提供的扩展功能,并不是标准的函数,必须引...
  • jiede1
  • jiede1
  • 2017年04月26日 17:19
  • 4239

Linux环境C语言把整数转换成字符串再保存该字符串数据为文本

一、前言 刚步入社会工作,只是想把自己做的事情做一个记录,同时也可以分享给网友,虽然都是些基础,但领导说得很对,细节非常重要; 本测试程序非常简单,对本人来说,意义在于读取电池放电的采样数据,然后把得...
  • psy6653
  • psy6653
  • 2017年01月03日 12:00
  • 2236

输入一个表示整数的字符串,把该字符串转换成整数并输出

/* copyright@nciaebupt 转载请注明出处 题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345", 则输出整数345。 分析:这道题尽管不是很难,学过...
  • wuwuwuwuwuwuwuwu
  • wuwuwuwuwuwuwuwu
  • 2013年07月04日 15:01
  • 1873

字符串与整数、浮点数、无符号整数之间的转换常用函数

atof(将字符串转换成浮点型数) 表头文件 #include 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串...
  • liucheng5037
  • liucheng5037
  • 2016年01月13日 22:37
  • 1061

【剑指offer-Java版】49把字符串转换为整数

字符串转换为整数 : atoi可能的输入: 1 带符号数 2 无符号数 3 零 4 空指针 5 超出表示范围 – 暂时仅仅是直接退出且设置最小 – 可以考虑此时抛个异常 6 非法输入,比如...
  • Sugar_Z_
  • Sugar_Z_
  • 2016年04月27日 09:48
  • 869

c语言,字符串转换成整数

c语言的数字字符串转换为整数,1.可接受“123 2123”处理为1232123;2.空指针、正负号、非纯数字字符串、数据越界溢出的错误处理。...
  • u010127332
  • u010127332
  • 2016年07月08日 21:26
  • 1612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串转化为整数
举报原因:
原因补充:

(最多只允许输入30个字)