[c++] atoi函数

Dec 1, 2016   #c++  #atoi 

Intro

这是遇到过的一道面试题,在很多工程代码中也经常用到。该函数主要实现将字符串转化成整数。

Code

一种最简单的方法,遍历字符串,然后依次解析每个字符。

// Solution 1
// A simple C++ program for implementation of atoi
int atoi(const char *nptr){
    int res = 0;
    for(int i = 0; nptr[i] != '\0'; ++i)
        res = res*10 + nptr[i] - '0';
     return res;
}

下面考虑一些特殊情况(实际中的特殊情况要全部考虑在内,这很重要)。首先是如何解析负数。

// Solution 2
int atoi(const char *nptr){
    int res = 0;
    int sign =-1;
    int i = 0;

    if(nptr[0]== '-'){
        sign = -1;
        i++;
     }
    for(; nptr[i] != '\0'; ++i)
        res = res*10 + nptr[i];
    return res*sign;
}
 

在此基础上,考虑空字符和非法字符的情况。

//Solution 3
bool isNumericChar(char x){
    return (x >= '0' && x <= '9') ? true: false;
}
int atoi(const char *nptr){
    if(*nptr == NULL)
        return 0;
    int res = 0;
    int sign = 1;
    int i = 0;
    
    if(nptr[0] == '-'){
        sign = -1;
        i++;
    }
    for(; nptr[i] != '\0'; ++i){
        if(isNumericChar(nptr[i]) == false)
            return 0;
         res = res*10 + nptr[i]-'0';
    }
    return sign*res;
}