atoi函数的实现
写这个函数的实现的原因很简单,而且也很容易,直接抄袭的库中的源码。因为有朋友面试的时候遇到了,前几天一个哥们面intel的时候也被问到了,巧合的是今天看广联达的面试题再次遇到。一周之内看到三次,让我不得不重视一下啊,毕竟自己也要开始面试题呀面试题了!
其实这个函数比较容易实现,不过写的很完善就不是那么容易,我自己也写了一下,然后去glibc库中看了一下,发现自己比较多的情况没有考虑到的,代码贴出来必然会被鄙视。所以这里就贴glibc库中使用的代码。本来打算贴vxwork的代码,可是vxwork的这段代码比较长而且有点晦涩,所以最后决定还是贴上相对更见简明的glibc库中的代码
其实不管是atoi、atol都是调用的strtol这个函数,所以实际贴的是这个函数的代码。其实直接自己看glibc库就好了:
#define LONG_MAX 2147483647L #define LONG_MIN (-2147483647L-1L)
long int _strtol_internal ( const char *nptr, char **endptr, int base, int group) { unsigned long int result = 0; long int sign = 1;
while (*nptr == ' ' || *nptr == '/t') ++nptr;
if (*nptr == '-') { sign = -1; ++nptr; } else if (*nptr == '+') ++nptr;
if (*nptr < '0' || *nptr > '9') { if (endptr != NULL) *endptr = (char *) nptr; return 0L; }
assert (base == 0); base = 10; if (*nptr == '0') { if (nptr[1] == 'x' || nptr[1] == 'X') { base = 16; nptr += 2; } else base = 8; }
while (*nptr >= '0' && *nptr <= '9') { unsigned long int digval = *nptr - '0'; if (result > LONG_MAX / 10 || (sign > 0 ? result == LONG_MAX / 10 && digval > LONG_MAX % 10 : (result == (( unsigned long int) LONG_MAX + 1) / 10 && digval > (( unsigned long int) LONG_MAX + 1) % 10))) { errno = ERANGE; return sign > 0 ? LONG_MAX : LONG_MIN; } result *= base; result += digval; ++nptr; }
return ( long int) result * sign; } atoi函数就是这个函数讲第二个参数置为NULL,第三个参数置为10。不知道你注意到了那些空格,越界之类的判断没有。我同学说他写出来的代码最后就被要求加上了这些东西,最后还因此被卡掉了(说是考虑不够慎密,汗)。