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