雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

atoi函数的实现——面试

Posted on 2013-11-20 18:03  huhuuu  阅读(516)  评论(0编辑  收藏  举报

主要考虑,字符串中是否有非法字符,字符串是否有溢出控制

#include<stdio.h>

int myatoi(const char *str){
    int sight=1,ret=0,i=0;
    if(str[i]==' ')i++;
    int max=(1<<31)-1;
    if(str[i]=='+'||str[i]=='-'){
        if(str[i]=='-')sight=-1;
        i++;
    }
    
    for(i=0;str[i]>='0'&&str[i]<='9';i++){
        ret*=10;
        ret+=str[i]-'0';
        if(ret>max){//溢出控制
            ret=max;break;
        }
    }
    return ret*sight;
}

int main(){
    printf("%d\n",myatoi("214748.3649"));
}
View Code

 

后来仔细想想发现自己的代码弱爆了!

改变如下:

#include<stdio.h>
#include<iostream>
using namespace std;

int myatoi(char *str){
    if(NULL == str)return 0;//处理空指针,加强程序的鲁棒性
    int sight=1,ret=0,i=0;

    while(str[i]==' ')i++;//处理字符串开始的空格

    if(str[i]=='+'||str[i]=='-'){ //处理正负号
        if(str[i]=='-')sight=-1;
        i++;
    }

    for(;str[i]>='0'&&str[i]<='9';i++){
        ret*=10;
        ret+=str[i]-'0';
        if(ret<0){//溢出控制
            return 0;
        }
    }

    return ret*sight;
}


int main(){
    char *s=NULL;
    printf("%d\n",myatoi(s));
    printf("%d\n",myatoi("   -123189267q    2e.1"));
    getchar();
    return 0;
}