面试笔试之atoi函数

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来进行反转的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值