虽然网上可以看到很多atoi()函数的实现方法,但是就函数功能和健壮性上来将却是不尽相同。这里我以自己对函数功能和容错性的理解,实现atoi()函数。
步骤:<1>判断传入指针是否为空
<2>声明变量保存结果和符号
<3>跳过字符串开头的空格(如果有)
<4>记录字符串开头的符号(如果有)
<5>判断字符是否为数字。如果是加入结果变量;如果不是结束循环。
<6>判断数字正负并输出。
#include <iostream>
#include "assert.h"
using namespace std;
int atoi(char *s)
{
//判断指针是否为零
assert(s != NULL);
//声明变量保存结果和正负符号
long long result = 0;
int flg = 1;
//跳过开头空格部分
while(*s == ' ')
{
s++;
}
//记录符号位
if(*s == '-')
{
flg = -1;
s++;
}
if(*s == '+')
{
flg = 1;
s++;
}
//判断字符是否为数字。是数字加入结果变量/不是数字结束循环
while(*s<='9' && *s>='0')
{
result = result * 10 + *s - '0';
s++;
//数值如果超出int的表示范围 返回
if(result > 0x7FFFFFFF)
{
if(flg == 1)
{
cout<<"Beyond the range of int ";
return 0;
}
else
{
if(result > 0x80000000)
{
cout<<"Beyond the range of int ";
return 0;
}
}
}
}
//判断正负并输出
if(flg == 1)
{
return (int)result;
}
else
{
return (int)result * flg;
}
}
说明:1)0x7FFFFFF是int能表示的最大正整数,又因为result为long long 型所以0x7FFFFFFF也会被隐式转换为long long。
2)0x80000000是int能表示的最小负整数是负数,又因为被隐式转换为long long 型所以变为正数,所以当做正数来比较(看待)。
3)result使用long long型而不使用unsigned int型的原因是后者可能会出现溢出,而且溢出之后的结果依旧可以符合条件不报错。