昨天在某论坛看到大家在讨论几个面试题,其中一个是把十进制的字符串转换为数字。看到很多人的回复就是几个字“太简单了!”。看完这些人的回复后,我就在想,真的那么简单吗?如果不要求异常处理的话,的确不难;要如果要求异常处理,就很难把异常情况考虑全了。

    要想把异常情况都考虑全,只有在单元测试用例上多下功夫了。

    下面是把十进制字符串转换为数字的函数代码,添加了异常处理,但却为对异常进行分类。

int DecToInt(const char* pcInput)
{
if (NULL == pcInput)
{
throw -1;
}

int iRet = 0;

int iSign = 1;
int iIdx = 0;

/*判断输入是不是负数*/
if ('-' == pcInput[0])
{
iSign
= -1;
iIdx
++;
}
else if ('+' == pcInput[0])
{
iSign = 1;
iIdx
++;
}
else
{
}


while (pcInput[iIdx])
{
/*判断单个字符是不是数字,如果不是,抛出异常*/
int iNum = pcInput[iIdx] - '0';
if ((iNum < 0) || (iNum > 9))
{
throw -1;
}

/*判断是否越界,如果越界,抛出异常*/
int iMax = ~(1 << (8*sizeof(int)-1));
if ((iMax/10 < iRet) || ((iMax-(10*iRet)) < iNum))
{
throw -1;
}

iRet
= (10*iRet) + iNum;

iIdx
++;
}

/*字符串为空时,抛出异常*/
if (0 == iIdx)
{
throw -1;
}

iRet
= iRet * iSign;

return iRet;
}

    其中,使用的单元测试用例分别是:

"0";

"1234";

"+1234";

"-1234";

"2147483647"

"-2147483647"

"2147483648"

"-2147483648"

"12k12"

""

NULL

posted on 2011-07-10 09:23  闲云鹤  阅读(4270)  评论(0编辑  收藏  举报