题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
要点:
运用string的库函数进行string与int之间的互相转换
string str("skdafj");
int a = stoi(str.c_str());
string b = to_string(a);
本题思路
- 指针是否为空指针以及字符串是否为空字符串;
- 字符串对于正负号的处理;
- 输入值是否为合法值,即小于等于'9',大于等于'0';
- int为32位,需要判断是否溢出;
- 数字前面出现多个正负号,则判错,返回0,如“++123”,“--123”,“+-123”,“-+123”
连续的数字被其他符号隔开,则返回0,如“ 123a321”," 123 123",都是返回0
如果超出了int范围(-2147483648--2147483647),返回临界最大值,也就是说如果是负数返回-2147483648,整数则返回2147483647
#include <iostream>
#include <string>
using namespace std;
//运用string的库函数进行string与int之间的互相转换
//string str("skdafj");
//int a = stoi(str.c_str());
//string b = to_string(a);
class Solution {
public:
int my_stoi(string &str)
{
long long num = 0;
bool flag = true; //正负标志,整数默认为true,负数为false
//转换为c_str() 末位为'\0'
const char * cstr = str.c_str();
if (cstr != NULL && *cstr != '\0')
{
if (*cstr == '+')
{
cstr++;
}
else if (*cstr == '-')
{
flag = false;
cstr++;
}
if (*cstr != '\0')
{
num = strToIntCore(cstr, flag);
}
}
return num;
}
private:
int strToIntCore(const char *cstr, int flag)
{
long long num = 0;
while (*cstr != '\0')
{
int n = flag ? 1 : -1;
if ('0' <= *cstr && *cstr <= '9')
{
num = num * 10 + n * (*cstr - '0');
if (!n && num < (signed int)0x80000000 || n && num > 0x7FFFFFFF )-2147483648--2147483647
{
num = 0;
break;
}
cstr++;
}
else
{
num = 0;
break;
}
}
return num;
}
};
int main()
{
Solution s;
string str;
getline(cin, str);
cout << s.my_stoi(str) << endl;
system("pause");
return 0;
}