字符串转整数一种实现

来源:互联网 发布:cydia中文软件源 编辑:程序博客网 时间:2024/04/29 15:15

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
原创粉丝点击