库函数atoi

31 篇文章 3 订阅

欢迎采访

首页_码到城攻码到城攻分享但不限于IT技术经验技巧、软硬资源、所闻所见所领会等,站点提供移动阅读、文章搜索、在线留言、支付打赏、个人中心、免签支付等功能https://www.codecomeon.com/

函数名:atoi

功能: 把一个字符串转换成一个整数。

看似简单,主要是情况太多,需要注意考虑。

测试代码:

Test(NULL);
Test("");
Test("123");
Test("+123");
Test("-123");
Test("1a33");
Test("+0");
Test("-0");
//有效的最大正整数, 0x7FFFFFFF
Test("+2147483647");    
Test("-2147483647");
Test("+2147483648");
//有效的最小负整数, 0x80000000
Test("-2147483648");    
Test("+2147483649");
Test("-2147483649");
Test("+");
Test("-");

详细代码:

#pragma once

long long StrToIntCore(const char* str, bool minus);

enum Status 
{ 
	kValid = 0,//合法输入
	kInvalid   //非法输入
};

int g_nStatus = kValid;    //一个全局状态控制,初始化为合法

int StrToInt(const char* str)
{
	g_nStatus = kInvalid;  //非法
	long long num = 0;     //装最后返回的整数结果

	if (str != NULL && *str != '\0')
	{
		bool minus = false;//是不是负号,初始化为不是
		if (*str == '+')   //考虑正号
			str++;
		else if (*str == '-')
		{
			str++;
			minus = true;  //是负号,minus置为真
		}

		if (*str != '\0')  
		{
			num = StrToIntCore(str, minus);
		}
	}

	return (int)num;
}

long long StrToIntCore(const char* digit, bool minus)
{
	long long num = 0;

	while (*digit != '\0')              //正负号处理完成
	{
		if (*digit >= '0' && *digit <= '9')
		{
			int flag = minus ? -1 : 1;  //整正负结果
			num = num * 10 + flag * (*digit - '0');

			if ((!minus && num > 0x7FFFFFFF)                //正数最大
				|| (minus && num < (signed int)0x80000000)) //负数最小
			{
				num = 0;
				break;
			}

			digit++;
		}
		else                            //出现非法字符
		{
			num = 0;
			break;
		}
	}

	if (*digit == '\0')                 //这种‘\0’为合法
	{
		g_nStatus = kValid;
	}

	return num;
}


void Test(char* string)
{
	int result = StrToInt(string);
	if (result == 0 && g_nStatus == kInvalid)
		printf("the input %s is invalid.\n", string);
	else
		printf("number for %s is: %d.\n", string, result);
}

void _Test()
{
	Test(NULL);

	Test("");

	Test("123");

	Test("+123");

	Test("-123");

	Test("1a33");

	Test("+0");

	Test("-0");

	//有效的最大正整数, 0x7FFFFFFF
	Test("+2147483647");

	Test("-2147483647");

	Test("+2147483648");

	//有效的最小负整数, 0x80000000
	Test("-2147483648");

	Test("+2147483649");

	Test("-2147483649");

	Test("+");

	Test("-");
}

分析:

1.有几种情况都是返回零,但是需要知道分别是什么情况,就用一个全局量g_nStatus去控制,是合法零还是非法零
2.minus控制整数的正负,true就是负号;
3.是非法输入,都有g_nStatus状态控制,在输出的时候,判断输出零时,g_nStatus的状态;

测试结果:


 
赐教!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值