处理好正负值边界的问题即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <assert.h>
int myatoi(char *str)
{
int ret = 0, cur;
int flag = 1;
assert(str != NULL);
while (*str == ' ') {
str++;
}
if (*str == '-' || *str == '+') {
if (*str == '-') {
flag = -1;
}
str++;
}
while (*str >= '0' && *str <= '9') {
cur = *str - '0';
if (flag == 1) {
if (ret > INT_MAX / 10 || (ret == INT_MAX / 10 && cur >= INT_MAX % 10)) {
return INT_MAX;
}
}
else {
if (-ret < INT_MIN / 10 || (-ret == INT_MIN / 10 && -cur <= INT_MIN % 10)) {
return INT_MIN;
}
}
ret = ret * 10 + cur;
str++;
}
return ret * flag;
}
int main()
{
printf("%d\n", myatoi(" -123345123345123"));
printf("%d\n", myatoi(" +123345123345123"));
printf("%d\n", myatoi(" +1233 123"));
printf("%d\n", myatoi(" 1233123"));
printf("%d\n", myatoi(" -2147483647"));
printf("%d\n", myatoi(" -2147483648"));
printf("%d\n", myatoi(" -2147483649"));
printf("%d\n", myatoi(" 2147483646"));
printf("%d\n", myatoi(" 2147483647"));
printf("%d\n", myatoi(" 2147483648"));
return 0;
}
其中INT_MAX和INT_MIN定义于头文件limits.h中。
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
INT_MIN为-2147483648,不直接定义成-2147483648是因为这是一个表达式,会先将2147483648保存到int变量中再取赋值,而保存的过程中就会发生溢出。