[Leetcode]-String to Integer (atoi)

mplement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.

题目:字串转整数
注意:细节部分非常多,须要考虑非常多情况
1、int溢出推断
2、正负号,详细情况见main函数中
3、含有空格的情况
结果:4ms

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <limits.h>
int myAtoi(char* str) {
   //"NULL"  "000234"  "+23" "-34" "+-34"  "    010"
    if(NULL == str )        
        return 0;    
    int sum  = 0.0;
    int f  = 0;
    int DIV = INT_MAX/10;
    while('' != *str)    
    {        
        if(*str == '+')
        {
            str++;
            if(*str < '0' || *str > '9') return 0;
            else    f = 0;
        }
        if(*str == '-')
        {
            str++;
            if(*str < '0' || *str > '9') return 0;
            else    f = 1;
        }

        if(*str >= '0' && *str<= '9' )
        {
            if(sum > DIV && f == 0) return INT_MAX;
            if(sum > DIV && f == 1) return -INT_MAX-1;

            sum = sum * 10.0;

            if(INT_MAX - *str + '0' < sum  && f == 0)       return INT_MAX;
            if((INT_MAX - (*str - '0') < sum ) && (f == 1)) return -INT_MAX-1;

            sum = sum + *str - '0';

            str++;
            if(*str == '')                    break;
            else if(*str < '0' || *str > '9')   break;
        }
        else
        {
            if(*str >= 'a' && *str <= 'z' )     break;
            str++;
        }
    }
    if(f) sum = -sum; 
    return sum;
}
int main()
{
    char *str = "0034";
    int r = myAtoi(str);
    printf("myAtoi str0 is : %d
",r);

    char *str1 = "00";
    int r1 = myAtoi(str1);
    printf("myAtoi str1 is : %d
",r1);

    char *str2 = "+23";
    int r2 = myAtoi(str2);
    printf("myAtoi str2 is : %d
",r2);

    char *str3 = "-2345";
    int r3 = myAtoi(str3);
    printf("myAtoi str3 is : %d
",r3);

    char *str4 = "+-23";
    int r4 = myAtoi(str4);
    printf("myAtoi str4 is : %d
",r4);//  expected 0

    char *str5 = "    010";
    int r5 = myAtoi(str5);
    printf("myAtoi str5 is : %d
",r5);

    char *str6 = "    +0104";
    int r6 = myAtoi(str6);
    printf("myAtoi str6 is : %d
",r6);

    char *str7 = "    -0187";
    int r7 = myAtoi(str7);
    printf("myAtoi str7 is : %d
",r7);//  expected -187

    char *str8 = "    -018a567";
    int r8 = myAtoi(str8);
    printf("myAtoi str8 is : %d
",r8); //  expected -18

    char *str9 = "2147483648";
    int r9 = myAtoi(str9);
    printf("myAtoi str9 is : %d
",r9); //  expected 2147483647  因为越界,仅仅取最大

    char *str10 = "-2147483649";
    int r10 = myAtoi(str10);
    printf("myAtoi str10 is : %d
",r10); //  expected -2147483648 

    char *str11 = "- 204";
    int r11 = myAtoi(str11);
    printf("myAtoi str11 is : %d
",r11); //  expected 0  

    char *str12 = "b3424242";
    int r12 = myAtoi(str12);
    printf("myAtoi str12 is : %d
",r12); //  expected 0  

    while(0);
}
原文地址:https://www.cnblogs.com/gcczhongduan/p/5059513.html