由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 函数atoi的实现
相关主题
atoi overflow怎么办?请问如何安全地reverse 一个integer
帮忙看看我写的atoi有没有bug, 谢谢reverse an integer 怎么判断是否 overflow 来着
atoi的溢出处理的想法问个越界的问题
关于atoi的overflow问两道bloomberg的题目
onsite完,攒rp系列(二)ms面试问了atoi,结果搞了半天我还是搞错了
经典题atoi的溢出处理写了个atoi,大家帮看有没有哪里错了?
问一个atoi overflow的问题str2int中overflow该如何处理?
atoi很不好写,头都大了...问个简单C reverse int
相关话题的讨论汇总
话题: int话题: ures话题: pcur话题: overflow话题: unsigned
进入JobHunting版参与讨论
1 (共1页)
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
3
所以我想用long存放中间结果以简化实现。
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;
}
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
问个简单C reverse intonsite完,攒rp系列(二)
问个《编程实践》(英文版)里面的问题经典题atoi的溢出处理
弱弱的问一个问题问一个atoi overflow的问题
150上的11.3,用1GByte的memory找出4B整数中的missing oneatoi很不好写,头都大了...
atoi overflow怎么办?请问如何安全地reverse 一个integer
帮忙看看我写的atoi有没有bug, 谢谢reverse an integer 怎么判断是否 overflow 来着
atoi的溢出处理的想法问个越界的问题
关于atoi的overflow问两道bloomberg的题目
相关话题的讨论汇总
话题: int话题: ures话题: pcur话题: overflow话题: unsigned