网上也看了不少atoi的实现,不是很理想,自己写了一个,请大家参考:
功能点:
- 负号的判断
- 非法数字的判断,读到非数字字符时,返回。
- 实现了上溢和下溢的判断,如果溢出,打印溢出信息并返回0。
还有一点要注意的就是 INT_MIN(refer to limits.h)的操作一定要小心,容易溢出,即不能对之做减法。
#include <stdio.h>
#include <limits.h>
int my_atoi(char *src){
if(src == NULL)
return 0;
int flag = 1;
char *p = src;
if(*p == '-'){
flag = -1;
p++;
}
int ans = 0;
int tmp = 0;
while(isdigit(*p)){
tmp = *p++ - '0';
if((flag == 1) && (tmp > INT_MAX - ans * 10)){
printf("up overflow!!!\n");
return 0;
}
else if((flag == -1) && ( flag * tmp < (INT_MIN + ans * 10))){
printf("down overflow!!!\n");
return 0;
}
ans = ans * 10 + tmp;
}
return ans * flag;
}
int main(int argc, const char *argv[])
{
printf("int value range %d~%d\n", INT_MIN, INT_MAX);
char s[1000] = {0};
while(scanf("%s", &s) != EOF){
printf("%d\n", my_atoi(s));
}
return 0;
}