昨天在某论坛看到大家在讨论几个面试题,其中一个是把十进制的字符串转换为数字。看到很多人的回复就是几个字“太简单了!”。看完这些人的回复后,我就在想,真的那么简单吗?如果不要求异常处理的话,的确不难;要如果要求异常处理,就很难把异常情况考虑全了。
要想把异常情况都考虑全,只有在单元测试用例上多下功夫了。
下面是把十进制字符串转换为数字的函数代码,添加了异常处理,但却为对异常进行分类。
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++;
}
{
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++;
}
iSign = 1;
iIdx++;
}
else
{
}
{
/*判断单个字符是不是数字,如果不是,抛出异常*/
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