面试笔试之atoi函数

来源:互联网 发布:域名备案系统 编辑:程序博客网 时间:2024/05/18 19:21
atoi函数: 假设我们不考虑进制问题,只考虑10进制
     int atoi(char *str)
     将字符串转换为int整数。需要考虑的问题:
    1. 字符串是不是不能为NULL? assert()
    2. 字符串开头部分有空白符(isspace())怎么办?
    3. 字符串中带符号位+-怎么办?
    4. 字符串转变过程中遇到非数字要直接返回当前值,怎么办?
    5. 如何转变?转变的方法是什么?*10+
    6. 溢出怎么办?
    7. 溢出有上溢和下溢之分?所以需要考虑int的范围
    8. 如果还要考虑8进制 16进制 2进制 10进制的问题的话,8进制以0开头,16进制以0x或者0X开头,10进制则没有,2进制的话。
        实现代码是参考了http://www.wypblog.com/archives/224:
#include <stdio.h> #include <assert.h> #define MAX_INT ((1 << 31) - 1)#define MIN_INT (-(1 << 31)) int atoi(const char *str){    assert(str != NULL);    char *temp = str;    int i = 0;    int flags = 0;    unsigned int sum = 0;    while(*temp == ' ' || *temp == '\t' || *temp == '\n') ++temp;    // 下面这个判断貌似没有必须必要    if(*temp != '-' && *temp != '+' && (*temp < '0' || *temp > '9')){//第一个字符不是数字        return 0;    }     if(*temp == '-'){ //第一个是负号        flags = 1;        ++temp;    }else if(*temp == '+'){        ++temp;    }    while(*temp >= '0' && *temp <= '9'){        if(!flags){//上溢            if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '7'))){                return MAX_INT;            }        }else{//下溢            if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '8'))){                return MIN_INT;            }        }        sum = sum * 10 + (*temp - '0');        ++temp;    }     return flags ? (-1 * sum) : sum;} int main(){    printf("%d\n", atoi("123"));    return 0;}
说明:
反转部分写的稍显麻烦,应该利用--str和dst来进行反转的。