天天看点

C++实现atoi函数——考虑各类异常case

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
           

继续阅读