我自己写的atoi(). 字符串转整型.
enum ErrCode
{
Err_OK,
Err_InvalidParam,
Err_Overflow,
Err_Underflow,
};
ErrCode myAtoI(const char* pch, int&result)
{
// param checking.
if (NULL == pch)
return Err_InvalidParam;
const char *p = pch;
// signal checking.
bool isNegative = false;
if ('-' == *p)
{
isNegative = true;
p++;
}
else if ('+' == *p)
p++;
// If isNegative, uMax should be 1 bigger than INT_MAX (=abs(INT_MIN)).
// because abs(INT_MIN) is 1 bigger than abs(INT_MAX).
unsigned int uMax = (unsigned int)INT_MAX;
if (isNegative)
uMax++;
// loop check each char.
unsigned int uSum = 0;
while (('\0' != *p) && (*p >= '0') && (*p <= '9'))
{
// overflow or underflow checking
if ((uSum > uMax/10) ||
((uSum == uMax/10) && ((unsigned int)((*p)-'0') > uMax - uSum*10)))
{
result = (isNegative)? INT_MIN: INT_MAX;
return (isNegative)? Err_Underflow: Err_Underflow;
}
// calculate the sum
uSum = ((uSum*10u) + (*p) - '0');
p++;
}
result = (isNegative? -1: 1) * (int)uSum;
return Err_OK;
}