面试题atoi的模拟实现

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


你可能感兴趣的:(面试题atoi的模拟实现)