模拟实现atoi函数

请记住那些对你好的人,因为他们本可以不这么做 

文章目录


  大家好,我是纪宁。

  atoi函数,它的功能是将数字字符转化为数字。我第一次见这个函数还是在大一上在刷蓝桥杯的时候,有一个关于回文数字的题,要解决将字符转化为数字的问题。白驹过隙,转眼间已经快大二了。这篇文章,纪宁就带你了解并实现atoi函数。

一、atoi函数介绍 

  atoi函数,可以将一串数字字符转化为数字。例如,可以将 "12345678" 转化为整形 12345678 。当字符串最前面有空格或者0的时候,atoi函数会自动将空格或者0删去,从第一个非0数字字符开始转化,直到遇见‘\0’或者非数字字符停止。

#include<stdlib.h>
#include<stdio.h>
int main()
{
	char str1[30] = { "0" };
	while ((scanf("%s", str1) != EOF))
	{
		printf("%d\n", atoi(str1));
	}
	return 0;
}

分别采用如下几种情况的输入对atoi函数的结果进行测试

  1.数字字符的前面有字符0

  2.数字字符前面有非数字字符

  3.数字字符前面有空格和字符0

  4.数字字符后面有非数字字符

  5.前面有字符0后面有负号

  6.只有负号和数字字符

  7.负号加数字字符加非数字字符

得到的结果如下

  根据上述测试结果,我们可以大致模拟atoi函数的实现。

二、模拟实现

  当我们模拟实现atoi函数的时候,最困难的就是处理掉一些函数处理异常字符只保留部分字符串的功能。

  当函数传过来的指针是空指针时,要进行断言;当函数传过来的字符串为空字符串时,要提示使用者:Abnormal Results(异常结果),再返回0,与正常返回结果是0的情况做区分;字符串的前半部分的空格和0都要在正常的 1~9 字符出现之前删掉,这部分用循环来完成;当正常数字字符串前面有符号时,要将符号转化为flag的正负来使用;当字符串前半部分有其他字符(字符+和字符-除外)时,直接返回0。

  数字字符串部分的处理:当程序识别出了即将开始进行字符串的转化时,还要保证开始之后的字符也为数字字符,在确保这写后,定义一个long long型的长整型,用来存放转化后的数字。当要转化大数字字符串转化为数字太大时,则也返回异常值0。

  解引用指针(*str)可得到数字字符,再用这个数字字符减去字符 ‘0’ ,就可以得到整形的数字,如此往复,经过简单的处理,则可得到数字字符串对应的整个整形数字,这个得到的数字就是正常值,返回即可。

  在判断返回的值是否是正常时,可以定义一个全局枚举类型变量,并将它的初值赋为 WRONG,如果正常转化成了数字,则再将枚举类型变量的值赋值为RIGHT。

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
enum JUD
{
	WRONG,
	RIGHT
}JUD=WRONG;
int my_atoi(const char* str)
{
	assert(str);
	int flag = 1;
	if (*str == '\0')
		return 0;
	while(*str == ' '||*str=='0')//处理空格
		str++;
	if (*str > '9' || *str < '0'&&*str!='-'&&*str!='+')
		return 0;
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
		str++;
	long long ret = 0;
	if (*str >= '1' && *str <= '9')
	{
		while (*str != '\0'&&*str>='0'&&*str<='9')
		{
			ret = ret * 10 + flag * (*str - '0');
			str++;
			if (ret<INT_MIN || ret>INT_MAX)
				return 0;
		}
	}
	JUD = RIGHT;
	return (int)ret;
}
int main()
{
	char str1[30] = { "0" };
	scanf("%s", str1);
	int ret = my_atoi(str1);
	if (JUD == WRONG)
		printf("Abnormal Results:%d\n",  ret);
	else
		printf("NOrmal Results:%d\n",  ret);
	return 0;
}

在这里插入图片描述

  博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰     裤    辣 !!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值