考察点:
1. 不合法检查
a. NULL
b. ""
c. "+"
d. " "
e. "124jio"
2. 溢出情况的处理
基于上述考虑的代码如下,采用一个全局状态变量来处理不合法和溢出情况。
typedef enum{INVALID, VALID} ValidFlag;
ValidFlag flag;
int atoi(const char *s) {
char *p;
int sign;
long long total;
if (s == NULL || *s == '\0')
return flag = INVALID;
p = s;
while (isspace((int)(unsigned int)*p))
p++;
sign = (*p == '-') ? -1 : 1;
if (*p == '+' || *p == '-'){
++p;
}
if (*p == '\0') // "+" "-" " "check
return flag = INVALID;
total = 0;
while (isdigit((int)(unsigned int)*p)) {
total = total * 10 + (int)(unsigned int)*p - '0';
if (total < 0 //overflow check
|| total > (long long)INT_MAX + 1 && sign < 0
|| total > (long long)INT_MAX && sign > 0)
return flag = INVALID;
p++;
}
if (*p == '\0') {
flag = VALID;
return sign == -1 ? -total : total;
}
return flag = INVALID;
}
与此类似的htoi,只不过多了前缀0x或0X,以及需要处理a-f, A-F,别忘了total = total * 16 + *p - 'a' + 10;
typedef enum {INVALID, VALID} ValidFlag;
ValidFlag flag;
int htoi(const char *s) {
int sign;
char *p = s;
long long total = 0;
if (s == NULL || *s == '\0')
return flag = INVALID;
while(isspace(*p))
p++;
sign = (*p == '-') ? -1 : 1;
if (*p == '+' || *p == '-')
p++;
if (*p == '0' && (*(p+1) == 'X' || *(p+1) == 'x'))
p += 2;
if (*p == '\0') //" " "+" "0x" "-0x" check
return flag = INVALID;
while (*p) {
if (isdigit(*p))
total = total * 16 + *p - '0';
else if ('a' <= *p && *p <= 'f')
total = total * 16 + *p - 'a' + 10;
else if ('A' <= *p && *p <= 'F')
total = total * 16 + *p - 'A' + 10;
else
return flag = INVALID;
if (total < 0
|| total > (long long)INT_MAX && sign > 0
|| total > (long long)INT_MAX + 1 && sign < 0)
return flag = INVALID;
p++;
}
if (*p == '\0') {
flag = VALID;
return sign > 0 ? total : -total;
}
return flag = INVALID;
}