字符串转化为整数

今天做了一道简单的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/

时间: 2024-10-14 04:52:13

字符串转化为整数的相关文章

剑指offer 把字符串转化为整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路:字符串转化为整数的方法num = num * 10 + str[i] - '0':特殊情况:1.输入字符串为NULL: 2.输入字符串只有+/-: 3.转化的数字大于最大值或小于

将字符串转化为整数

将字符串转化为整数要考虑到很多的情况,首先对于字符串是空指针的处理,字符串开始带有'+''-'的情况,字符串中有空格等不是数字的处理,对于这些情况的处理,主要运用的方法是定义一个全局变量,在字符串中出现一些特殊情况的时候,改变全局变量的方法,作为标示符,这样就可以达到预期的效果. int symbol = -1; int fun(const char *src) {long long num = 0; int flag = 1; int symbol = 1; while (src != NUL

170319 剑指offer 1.把一个字符串转化成整数(简单问题的全面性考虑)

工作的时间越长,越感觉基础的重要性,当我们对程序的框架结构越来越熟悉的时候,越会注意这一点,在工作当中,功能的实现是重要的,但是代码的健壮性,重用性,与扩展性确往往更为重要,在学习新技术的同时,我们或许应该抽出一点时间,去思考代码可能出现的问题. 关于剑指offer的这本书,可能所有刚毕业找工作的人,或者准备找工作的人都曾经看过,但是当时我们面对一些东西的时候心情过于浮躁,往往忽视了简单的却又十分重要的环节,(ps:也可能只有我是这样) 面试中一道简单的问题(把一个字符串转化成整数) 可能接触c

java实现字符串转化为整数

1.思路及注意事项 参考:http://blog.sina.com.cn/s/blog_514c89a90100d7qh.html 概括起来有几种情况 1)字符串开头是"+"号或"-"号的处理 2)非法字符的判断(不是数字) 3)整数溢出问题. 看看Java函数库中的Integer.parseInt(String sting)的源码如何处理这些问题的. /** * Parses the specified string as a signed decimal int

将字符串转化为整数问题(C++)

 1.将字符串转化为整数问题(C++) 仿照atoi实现代码: // 仿照atoi函数实现字符串转化为整形数据问题 // #include "stdafx.h" enum MyEnum { eValid = 0,//合法 unValid //不合法 }; int mState = eValid;//定义全局变量,输入非法时设置该全局变量: //则通过检查该全局变量就能够判断输入是否合法: //实现字符串转化为整形数据atoi问题 int StrToInt(char* str) {

算法: 把字字符串转化为整数;

算法: 把字字符串转化为整数: * @问题: 把字符串转化为整数* 题目描述* 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),* 要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0.* 输入描述:* 输入一个字符串,包括数字字母符号,可以为空* 输出描述:* 如果是合法的数值表达则返回该数字,否则返回0* @思路: 转化为数组,判断非空:然后根据数字0到9的ASIC码来确定,判断数组

Python:利用内建函数将字符串转化为整数

使用内建函数raw_input()内建函数,它读取标准输入,并将读取到的数据赋值给指定的变量.我们可以使用int()内建函数将用户输入的字符串转换为整数: >>> user = raw_input("Enter login name:") Enter login name: root >>> print "Your Login is:", user Your Login is:  root 上面这个例子只能用于文本输入,下面输入一

字符串转化成整数

1 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0), 要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0. 输入 +2147483647       1a33 输出 2147483647        0 class Solution { public: int StrToInt(string str) { int n = str.size(), s = 1; long long re

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

我们知道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来检查了空指针,但是,试想一下,如果我们传进去的字符串