atoi函数:用来把一个字符串转换为整数,在模拟实现应注意以下几点:
1.检查字符串是否为空字符串;
2.区分空字符串与0字符返回值结果,这里用一个全局变量globle来区分;
3.考虑字符串的合法输入,如‘+’'-'号(并能区分),‘1~9’字符为合法输入;
4.考虑计算过程中的溢出。
代码实现:
#include <iostream>
#include <cstdlib>
#include <limits.h>
using namespace std;
enum Status
{
kValid=0, //合法
kInvalid //非法
};
int globle=kValid; //定义全局变量区分合法输出与非法输出
long long StrToInt(bool tag,const char *pStr)
{
long long num=0;
while(*pStr!='\0')
{
if((*pStr>='0')&&(*pStr<='9'))
{
int flag=tag?-1:1; //判断+-号
num=num*10+flag*(*pStr-'0'); //计算转换
if((num>INT_MAX)||(num<(signed int)0x80000000)) //判断溢出
{
num=0;
break;
}
pStr++;
}
else //不合法
{
num=0;
break;
}
}
if(*pStr=='\0')
globle=kValid; //转换完成变为合法
return num;
}
int my_atoi(const char *str)
{
globle=kInvalid;
long long num=0;
const char *pStr=str;
bool tag=false;
if(pStr!=NULL&&*pStr!='\0') //若为空串或为空直接返回
{
if(*pStr=='+') //判断正负号
pStr++;
else if(*pStr=='-')
{
tag=true;
pStr++;
}
if(*pStr!='\0')
{
num=StrToInt(tag,pStr);
}
}
return (int)num;
}
void test()
{
char str[]="123456"; //正常测试
int ret=my_atoi(str);
cout<<globle<<": ";
cout<<ret<<endl;
char str1[]=""; //空串
int ret1=my_atoi(str1);
cout<<globle<<": ";
cout<<ret1<<endl;
char str2[]="0"; //字符0
int ret2=my_atoi(str2);
cout<<globle<<": ";
cout<<ret2<<endl;
char str3[]="-123456"; //负数
int ret3=my_atoi(str3);
cout<<globle<<": ";
cout<<ret3<<endl;
}
int main()
{
test();
system("pause");
return 0;
}