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;
}