s****m 发帖数: 160 | 1 标准的C实现是用strtol做的,实例如下:
http://www.koders.com/c/fid772A1DFFFF802B239C481E127BE09BA87279
要考虑的边界条件很多。关键是overflow的话要返回最小的负值或者最大的正值。
我想实际面试的时候,我如果用long存放中间结果,这样不需要特别处理int
overflow的问题。请问这样做算是“作弊”吗? | w****x 发帖数: 2483 | 2 OVERFLOW的处理相当麻烦, 特别还要注意INT_MIN, INT_MAX的情况, 贴一个我修改了n
遍的代码:
int myatoi(const char* p)
{
assert(p);
//Judge signal
bool bNeg = false;
const char* pCur = p;
if(*pCur == '-' || *pCur == '+')
{
if (*pCur++ == '-')
bNeg = true;
}
//treat the rest as positive numeric number, so for negative number
//it is 2^31, and for positive number it is 2^31
unsigned int uLimit = bNeg ? 0x7FFFFFFF + 1 : 0x7FFFFFFF;
// The reson to use unsigned int rather than int is to deal with 2^31
unsigned int uRes = 0;
unsigned int uDummy = UINT_MAX/10; // used to judge overflow of unsigned
int
do
{
//Deals with illegal character
if (*pCur < '0' || *pCur > '9')
throw CException("Illegal character found");
//Get current digit
int nDigit = *pCur - '0';
//Detect the unsigned integer overflow
if (uRes > uDummy || (uRes == uDummy && nDigit > 6))
throw CException("Over flow detected");
//update uRes
uRes = uRes*10 + nDigit;
//Overflow situation if uRes isn't overflow
if (uRes > uLimit)
throw CException("Over flow detected");
pCur++;
}while (*pCur != 0); // WTF stupid error again, do while not while
return bNeg ? (int)(-uRes) : (int)(uRes);
} | s****m 发帖数: 160 | | b******t 发帖数: 965 | 4 其实大家都太挑战自我
要我来implement 内部用long long 然后越界的话转成 INT_MIN INT_MAX
简单很多
n
【在 w****x 的大作中提到】 : OVERFLOW的处理相当麻烦, 特别还要注意INT_MIN, INT_MAX的情况, 贴一个我修改了n : 遍的代码: : int myatoi(const char* p) : { : assert(p); : //Judge signal : bool bNeg = false; : const char* pCur = p; : if(*pCur == '-' || *pCur == '+') : {
| s******n 发帖数: 3946 | 5 要那么复杂么,只要判断前一个数和后一个数是否翻转了"-"即可
int atoi(char* str) {
bool neg = false;
if (*str=="-") {
str++;
neg = true;
} else if (*str=="+")
str++;
int value = 0;
while (*str) {
int digit = *str-'0';
if (digit>9 || digit<0) throw "error";
int newvalue = value*10 + neg?(-digit):digit;
if (value>0 && newvalue<0 || value<0 && newvalue>0) throw "overflow";
value = newvalue;
str++;
}
return value;
}
} |
|