题目概述
解题思路
就像本篇博文的题目所介绍的那样
这道题目就是让模拟实现atoi函数
结合库中的atoi函数,我们需要处理的情况有以下几种
各种情况分析
情况1:正常情况,给的字符串“123”,在正常的范围内
情况2:字符串为空
情况3:传入的数字为负数
情况4:字符串中间有异常字符的情况
情况5:字符串越界的情况
情况6:字符串开头有空格的情况
情况7:字符串开头有0的情况
对于上述这些情况,我们可以根据库函数的标准来模拟
也可以自己定义处理规则
我是用C++实现的,用了string类来保存字符串
atoi库函数是用过一个全局变量来保存是否输入非法的情况,如果非法,则返回值为0,这时就需要这个全局变量来观察是否是异常的0
而C++中可以用异常处理机制来处理错误的情况,我这里是用了pair结构体
结构体的第一个值代表是否转换成功,第二个值代表转换的结果
如果转换失败,则第二个值为0
代码实现
#include<iostream>
using namespace std;
#include<string>
pair<bool,long long> my_atoi(string& s)
{
if (s.empty())
return make_pair(false,0);
bool hasSimbol = true;
//跳过开始的空格和字符0
char fC = s[0];
int endIndex = 0;
for (int i = 0; i < s.size(); ++i)
{
fC = s[i];
endIndex = i;
if (fC != ' ' && fC != '0')
break;
}
//判断有无符号位
if (fC != '+' && fC != '-')
{
//第一个字符不为正负号,也不为数字
//否则,将符号位置为FALSE,代表没有符号位
if ((fC < '0') && (fC > '9'))
return make_pair(false, 0);
else
hasSimbol = false;
}
long long ret = 0;
int len = s.size();
int index = len - 1;
long long base = 1;
for (; index >= endIndex; index--)
{
if (index == endIndex && hasSimbol)
break;
char tmp = s[index];
if (tmp < '0' || tmp > '9')
return make_pair(false, 0);
ret += (tmp - '0')*base;
base *= 10;
//判断是否越界
if (fC == '-')
{
if (ret < (signed int)0x80000000)
return make_pair(false, 0);
}
else
{
if (ret > 0x7FFFFFFF)
return make_pair(false, 0);
}
}
if (hasSimbol)
{
if (fC == '-')
ret = (-ret);
}
return make_pair(true,ret);
}
void TestMyAtoi()
{
//测试正常情况
string s1("123");
pair<bool,long long> ret = my_atoi(s1);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
//测试字符串为空的情况
string s2;
my_atoi(s2);
ret = my_atoi(s2);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
//测试字符串的前面有负号的情况
string s3("-123");
my_atoi(s3);
ret = my_atoi(s3);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
//测试字符串中间不符合的情况
string s4("-1v3");
my_atoi(s4);
ret = my_atoi(s4);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
//测试字符串越界的情况
string s5("55555555555555555555555555555555555555");
my_atoi(s5);
ret = my_atoi(s5);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
string s6(" 123");
my_atoi(s6);
ret = my_atoi(s6);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
string s7(" -123");
my_atoi(s7);
ret = my_atoi(s7);
cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
}