函数atoi-详解以及模拟

atoi函数解释:

函数原型:

int atoi (const char * str);

函数说明:

 atoi函数返回值是整型;参数是一个常量字符串;

这个函数作用效果是将一个字符串转换为一个整型,返回的是这个转换之后整型的数值;

如果这个被操作的常量字符串开头是空字符,那么这个函数将自动跳过这些空字符只到第一个非空格字符被发现。接着从这个非空格字符开始往这个字符串后面操作,若是这个第一个非零字符是正负号,那么这个正负号将直接决定返回值的那个整型数值的正负;

若是这个字符串开头的不是空格或者不是数字字符,那么这个函数将直接返回零;

若是跳过空格以及识别正负号之后操作到非数字字符,那么也直接返回0;

若是在有效的数字字符串之间有非数字字符(无论是空格、正负号还是其他字符),这个函数将直接中断,将已经识别的数字字符转换成整型数值返回;

具体示例:

#include<stdio.h>
int main()
{
	char str_1[] = "   -123ab123";
	char str_2[] = "abcd23  12";
	char str_3[] = "  +12 12";
	char str_4[] = "  +12ab12";
	char str_5[] = "-123  12";
	char str_6[] = "-  123abc0";
	int reverse_num_1 = atoi(str_1);
	int reverse_num_2= atoi(str_2);
	int reverse_num_3 = atoi(str_3);
	int reverse_num_4 = atoi(str_4);
	int reverse_num_5 = atoi(str_5);
	int reverse_num_6= atoi(str_6);

 	printf("字符串str_1转换之后返回的数字是:%d\n", reverse_num_1);
	printf("字符串str_2转换之后返回的数字是:%d\n", reverse_num_2);
	printf("字符串str_3转换之后返回的数字是:%d\n", reverse_num_3);
	printf("字符串str_4转换之后返回的数字是:%d\n", reverse_num_4);
	printf("字符串str_5转换之后返回的数字是:%d\n", reverse_num_5);
	printf("字符串str_6转换之后返回的数字是:%d\n", reverse_num_6);

	return 0;
}


函数atoi的模拟实现:


int my_atoi(const char* str)
{
	while (isspace(*str))
	{
		str++;	//isspace这个函数的参数如果是空格那么就为真
	}
		//此时字符串已经来到了第一个非空格字符

	int flag = -1;	//先立一个表示正负号的旗帜,方便后续记录正负
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	if (*str == '+')//不用else是因为此时我们判断的字符可能也不是正负号
	{
		flag = 1;
		str++;
	}//此时我们跳过了可以跳过的非数字字符

	int ret = 0;
	while (*str != '\0')//我们将进入操作数字字符的过程,而这个过程是要将整个字符串判断完的
	{
		if (isdigit(*str))//是数字字符就返回非零值,那么条件就为真
		{
			ret = ret * 10 + (*str - '0') * flag;//仔细研究并且带入一些数字字符串就会发现行代码适用
		}
		else
		{
			return ret;//只要碰见了非数字字符就返回
		}
		str++;
	}
	return ret;
}
int main()
{
	char str[] = "   -123abc123";
	printf("%d\n", my_atoi(str));
	return 0;
}

当字符串中返回的数值很大或者是很小的时候,我们可以把ret的类型变换为long long类型的,最后用if语句判断一下返回值若是超过了INT_MAX或者是小于INT_MIN那么就返回这个整型的最大值或者是最小值,当然返回的时候要把ret强制类型转换为int型的。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值