将一个字符串转换为整数1

最初看这道题时,产生了一个疑问:将所有字符转换为整数后相加还是转换字符串中的数字字符。如果只转换数字字符,什么格式的数字字符合法?因为只给了一句:将一个字符串转换为整数,所以才会有这些疑问,权当思考一下。
在此给出题目的具体描述:
将一个字符串转换为整数,字符串中可能包含其他字符,但仅对字符串开头合法的数字字符进行转换。如: -123abc4,转换结果为-123;要求不能使用字符串转整数的库函数。
解题思路:
首先,写个测试用例:

int main(){
    long long result;
    string str = "-123456789char";
    result = strToInt(str);  //转换
    if(valid)  //全局变量,若输入字符串合法便输出结果
        cout << "Result is: " << result ;
    else
        cout << "Integer string is not valid!";

    return 0;
} 
Output:  -123456789

本题需要考虑的几个方面:

  1. 输入为空
  2. 正负号
  3. 非数字字符
  4. 溢出问题

函数的开发过程如下:
1.定义需要的变量

//全局变量,标记输入是否合法, 默认不合法
bool valid = false;

long long strToInt(string &str){
    //待返回的结果
    long long res = 0;
    //负号标记
    bool minus = false;
    //string迭代器
    string::iterator iterBeg = str.begin();
}

2.核心代码
考虑到数字可能有正负号,对其判断。若存在正负号,就使迭代器前进一个字符。如果之后的字符不是数字会直接退出,若是数字则使用公式转换为整数。例如扫描到第一个数字字符是2,result = 2,接下来扫描到第二个数字字符3, result就应该等于23,此时result = result*10+3,即 2*10+3 = 23; 扫描到第三个数字字符4, result = result * 10 + 4, 即23 * 10 + 4 = 234;依次类推,直到结尾或者遇到非数字字符便退出循环。
对于计算出的结果应判断是否有溢出,如溢出将结果设为0.

//如果字符串不为空
    if(*iterBeg != NULL){
        //判断正负号
        if(*iterBeg == '+')
            ++iterBeg;
        else if(*iterBeg == '-'){
            minus = true;
            ++iterBeg;
        }
        while(*iterBeg != NULL){  //循环至字符串末尾或非数字字符会退出
            if(*iterBeg >= '0' && *iterBeg <= '9'){
                valid = true;
                res = res * 10 + *iterBeg - '0';  //计算结果
                //溢出处理
                if(res > INT_MAX){  //上溢
                    cout << "Over flow\n";
                    res = 0;
                    break;  //溢出结果赋值为0,并退出
                }
                ++iterBeg;
            }else{ //字符非0-9的数字,即刻退出
                break;
            }
        }
        if(minus)  //负数转换
            res = 0 - res;
        if(res < INT_MIN){  //下溢
            cout << "Under flow\n";
            res = 0;
        }
    }
    return res;        

需要注意的地方:
C++中不能给string字符串赋值为NULL。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值