字符串转整数一种实现

step1 判断字符串是否是有效字符串

step2 将字符串转换成整数

需要注意点

step1中列举以下几个例子

case1 "a13"

case2   "-"  

case3 "-0"

case4 "01"

case5  "23dfd"

step2中需要注意的是

整数是有符号的

(c++中的表示climts库中的宏) INT_MAX INT_MIN的绝对值不同  (对应的是有符号整数的最大值和最小值)

在转换的时候需要注意符号对应的变化

接下来会附上代码

#include <iostream>
#include <string>
#include <climits>
using namespace std;
//判断是否是有效字符串
bool is_value(const string& s)
{
    if(s[0] != '-' && (s[0] < '0' || s[0] > '9'))       //这里的逻辑一定要弄清楚
        return false;                                   //只有当第一个不是'-'和数字的时候就返回
    if(s[0] == '-' && (s.size() == 1 || s[1] == '0'))
        return false;
    if(s[0] == '0' && s.size() > 1)
        return false;                                   //到此为止我们对字符串的第一个字符的判断结束
    for(size_t i = 1; i < s.size(); i++)
        if(s[i] < '0' || s[i] > '9')
            return false;
    return true;                                        //将所有的可能性排除后剩下的可能
}
int str_to_int(const string& s)
{
    if(s.size() == 0)
        return 0;
    if(!is_value(s))
        return 0;
    bool pos = s[0] == '-' ? false : true;              //符号位判断
    int minq = INT_MIN / 10;                            //因为INT_MIN的绝对值会比INT_MAX大一所以我们用范围大的
    int minr = INT_MIN % 10;
    int res = 0;
    int cur = 0;
    for(size_t i = pos ? 0 : 1; i < s.size(); i++)
    {
        cur = '0' - s[i];                               //负值
        if(res < minq || (res == minq && cur < minr))
            return 0;                                   //溢出
        res = res * 10 + cur;                           //负值的相加
    }
    if(pos && res == INT_MIN)                           //溢出
        return 0;
    return pos ? -res : res;
}
int main()
{

    string str1("a12");
    string str2("-");
    string str3("-0");
    string str4("08");
    string str5("97afda");
    string str6("4294967295");
    string str7("2147483647");
    string str8("-2147483648");
    string str9("7386234");
    string str10("6738764");
    cout << "str1(a12) " << str_to_int(str1) << endl;
    cout << "str2(-) " << str_to_int(str2) << endl;
    cout << "str3(-0) " << str_to_int(str3) << endl;
    cout << "str4(08) " << str_to_int(str4) << endl;
    cout << "str5(97afda) " << str_to_int(str5) << endl;
    cout << "str6(4294967295) " << str_to_int(str6) << endl;
    cout << "str7(2147483647) " << str_to_int(str7) << endl;
    cout << "str8(-2147483648) " << str_to_int(str8) << endl;
    cout << "str9(7386234) " << str_to_int(str9) << endl;
    cout << "str10(\"6738764\") " << str_to_int(str10) << endl;          //双引号要转义

    //cout << INT_MAX << '\t' << INT_MIN << endl;
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值