模拟实现atoi

atoi

函数原型:int atoi(const char *nptr);

函数功能:atoi 是把字符串转换成整型数的一个函数,atoi函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0;

我们在模拟实现atoi时需要注意以下几点:

①首先是空格情况,如果遇到空格则跳过空格,继续向后,若全是空格,则返回0;

②遇到正负号,如果遇到‘+’或‘-’,先使用一个flag标记这个状态,最后在根据flag来判断转换后整数的正负;

含有非数字字符,例如"12ac"、"#123"等,只要判断出字符串中含有此类字符则直接返回;

无数字字符,字符串中没有数字字符,直接返回0;

返回值,我们需要额外使用一个状态来标记函数返回值是正常返回,还是异常返回,原因在于,当我们输入0时会和那些异常返回混淆,因此增加一个状态标识异常;

⑥溢出情况,当字符串中的字符数字转换的整数太大或者太小,可以通过判断转换后的数字是否处于long的范围内。

以下给出代码:

//模拟实现atoi
#include<iostream>
#include<assert.h>
using namespace std;

bool stat = false;//用来判断结果是否正常

int my_atoi(const char* str)
{
	int flag = 1;
	long long ret = 0;
	assert(str);
	while (*str == ' ')
	{
		++str;
	}
	//判断是否到了结尾
	if (*str == '\0')
		return 0;
	//判断正负
	if (*str == '+')
		++str;
	else if (*str == '-')
	{
		flag = -1;
		++str;
	}
	//读取数字
	while (*str >= '0'&& *str <= '9')
	{
		ret = ret * 10 + flag*(*str - '0');
		//判断异常
		if (ret <= INT_MIN || ret >= INT_MAX)
			break;
		++str;
	}
	if (*str == '\0')
		stat = true;
	return (int)ret;
}

int main()
{
	const char* str = "+12345  ";
	int ret = 0;
	ret=my_atoi(str);
	if (stat == false)
		cout << "异常"<<endl;
	cout << ret << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/l__xing/article/details/80211507