模拟实现atoi

函数简介

    atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0  。特别注意,该函数要求被转换的字符串是按十进制数理解的atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1

官方案例:

/* atoi example */
#include <stdio.h>      /* printf, fgets */
#include <stdlib.h>     /* atoi */

int main ()
{
  int i;
  char buffer[256];
  printf ("Enter a number: ");
  fgets (buffer, 256, stdin);
  i = atoi (buffer);
  printf ("The value entered is %d. Its double is %d.\n",i,i*2);
  return 0;
}

 引自:atoi_百度百科   atoi - C++ Reference

函数模拟

  要基本模拟atoi函数首先要解决一下这些基本的问题

//空指针//空字符串//空白字符//正负号 //非数字字符//溢出 ,而且还要按照顺序来解决。

这时我们要引入两个函数

isspace 如果他的参数符合下列条件就返回真 : 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'

isdigit  如果他的参数符合下列条件就返回真   : 十进制数字 0~9

 

#include <assert.h>
#include <ctype.h>
#include <stdio.h>

enum Ststus
{
	VALIT,
   INVALIT
}status = INVALIT;


int my_atoi(char* arr)
{
	int flag = 1;
    //flag要置为一,否则如果没有下面正负号影响的话置成别的影响结果

	//空指针
	assert(arr);

	//空字符串
	if (*arr == '\0')
	{
		return 0;
	}

	//空白字符
	while (isspace(*arr))
	{
		arr++;
	}
	//正负号
	if (*arr == '+')
	{
		flag = 1;
		arr++;
	}
	else if (*arr == '-')
	{
		flag = -1;
		arr++;
	}

	long long n = 0;
   //我们要定义一个比int类型更大的数字来判断int是否溢出
	while (*arr)
	{
		if (isdigit(*arr))
		//检查十进制数字0~9 如果是返回为真 
		{
			n = n * 10 + flag*(*arr - '0');

			//检查溢出
			if (n < INT_MIN)
			{
				n = INT_MIN;
				break;
			}
			else if(n > INT_MAX)
			{
				n = INT_MAX;
				break;
			}
		}
		else
		{
			break;
		}
		arr++;
	}
	if (*arr == '\0')
	{
		status = VALIT;
        //如果字符串正常,到这里应该把状态置成VALIT(有效的)
	}

	return (int)n;
}
int main()
{
	char arr[100] = "     -12341";
	int ret = my_atoi(arr);

	if (status == VALIT)
	{
		printf("正常转化: %d\n", ret);
	}
	else
	{
		printf("非法转化: %d\n", ret);
	}
	return 0;
}

测试结果:

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值