C++实现atoi函数——考虑各类异常CASE
遇到一个实际问题,特别是逻辑并不复杂的情况,需要全方位考虑各种异常情况,只有在事先考虑到各种情况,才能保证程序的健壮性。也就是说程序首先逻辑要正确,并且同等重要的是程序必须要有鲁棒性。
列出输入的可能情况,正常输入是怎样的,异常输入是怎样的,每种情况需要对应什么输出。需要多思考,对一个问题,需要全面列举出它可能的bad input或者bad case,事先考虑好才不会给自己挖坑。
例如,考虑实现C++的int atoi(char * str)函数,将一个指定的字符数组转换为一个整数
首先,我们考虑正常的情况,“123”->123,“1”->1;然后我们考虑异常情况,这块直接关系你的程序时候的健壮
① str为NULL需要考虑,这种情况直接抛出异常
② 如果前面有空格的情况,需要去掉空格
③ 数字前面有正负号的情况,"+、-"需要特殊处理
④ 数字前有多个正负号,直接抛出异常
⑤ 如果字符包含非数字字符,需要截断处理
⑥ 如果字符数组太长,转换成int就会产生溢出,直接抛出异常
考虑到这些情况,程序就能hold住已知的全部异常输入
#include <iostream>
using namespace std;
int myAtoi(char * str){
// 异常输入①
if(str == NULL){
throw "param is NULL";
}
// 异常②
while(*str != '\0' && *str == ' '){
str ++;
}
// 异常③
bool isNeg = false;
if(*str == '+' || *str == '-'){
if(*str == '-'){
isNeg = true;
}
str ++;
}
// 异常④
if(*str < '0' || *str > '9'){
throw "not strat with number";
}
// 主体逻辑
int sum = 0;
while(*str != '\0'){
if(*str >= '0' && *str <= '9'){
sum = sum * 10 + *str - '0';
}else{
// 异常⑤
break;
}
// 异常⑥
if(sum < 0){
throw "over fill";
}
str ++;
}
if(isNeg){
sum = -1 * sum;
}
return sum;
}
int main() {
char str[100] = " -94032342";
int res = myAtoi(str);
cout <<res << endl ;
return 0;
}
结果如下
-94032342