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

#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 ",myatoi("214748.3649")); }
后来仔细想想发现自己的代码弱爆了!
改变如下:
#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 ",myatoi(s)); printf("%d ",myatoi(" -123189267q 2e.1")); getchar(); return 0; }