C语言 字符数组转换整数 stringToInt

工作了一段时间,一直在公司平台上面码代码,有一天同事分享,突然发现自己连基本的知识都快忘记了


字符串转化z整数数组是考验程序员基本功的经典题目

int stringToInt(const char *str)
{
}

先写一个简单的实现

int stringToInt(const char *str)
{
	char *p = str;
	
	int nNUM = 0;
	
	while (*p != '\0')
	{
		nNum = nNUM * 10 + (*p - '0');
		p++;
	}
	
	return nNUM;
}

主要逻辑应该就是这样,每取一位字符,用字符和'0'比较计算数值,累加到前面的数值*10上面

 前面的基础上考虑一下正负数问题

int stringToInt(const char *str)
{
	char *p = str;
	
	int nNUM = 0;
	
	bool bFlage = true;
	
	if (*p == '-')
	{
		bFlage = false;
		p++;
	}
	else if (*p == '+')
	{
		p++;
	}
	
	while (*p != '\0')
	{
		nNum = nNUM * 10 + (*p - '0');
		p++;
	}
	
	if (!bFlage)
	{
		nNUM = 0 - nNUM;
	}
	
	return nNUM;
}

除了+-还有其他非法字符,需要容错处理

int stringToInt(const char *str)
{
	char *p = str;
	
	int nNUM = 0;
	
	bool bFlage = true;
	
	if (*p == '-')
	{
		bFlage = false;
		p++;
	}
	else if (*p == '+')
	{
		p++;
	}
	
	while (*p != '\0')
	{
		if ((*P < '0') || (*p > '9'))
		{
			nNUM = 0;
			return nNUM;
		}
		
		nNum = nNUM * 10 + (*p - '0');
		p++;
	}
	
	if (!bFlage)
	{
		nNUM = 0 - nNUM;
	}
	
	return nNUM;
}
上面的代码无法判断0 是成功转换的字符串,还是非法数据之后的返回值,因此定义一个枚举常量,保存每次转换是否成功,可以使用系统枚举值,一般库函数都是自带的,保存对应操作是否成功

enum NumState
{
	OK = 1,
	ERROR
}

int stringToInt(const char *str)
{
	char *p = str;
	
	int nNUM = 0;
	
	bool bFlage = true;
	
	enum NumState oState = OK;
	
	if (*p == '-')
	{
		bFlage = false;
		p++;
	}
	else if (*p == '+')
	{
		p++;
	}
	
	while (*p != '\0')
	{
		if ((*P < '0') || (*p > '9'))
		{
			nNUM = ERROR;
			return nNUM;
		}
		
		nNum = nNUM * 10 + (*p - '0');
		p++;
	}
	
	if (!bFlage)
	{
		nNUM = 0 - nNUM;
	}
	
	return nNUM;
}

在考虑一下,除了上面问题应该还有溢出的问题,增加溢出的判断

int stringToInt(const char *str)
{
	char *p = str;
	
	int nNUM = 0;
	
	bool bFlage = true;
	
	enum NumState oState = OK;
	
	if (*p == '-')
	{
		bFlage = false;
		p++;
	}
	else if (*p == '+')
	{
		p++;
	}
	
	while (*p != '\0')
	{
		if ((*p < '0') || (*p > '9'))
		{
			oState = ERROR;
			nNUM = 0;
			break;
		}
		
		if ((nNUM * 10)>0 
			&& (*p - '0')
			&& (2147483647 - (nNUM * 10) < (*p - '0')))
		{
			oState = ERROR;
			nNUM = 0;
			break;
		}

		nNUM = nNUM * 10 + (*p - '0');

		p++;
	}
	
	if (!bFlage)
	{
		nNUM = 0 - nNUM;
	}
	
	return nNUM;
}


测试一下:

#include <stdio.h>
#include <stdbool.h>

enum NumState
{
	OK = 1,
	ERROR
};

int stringToInt(const char *str)
{
	char *p = str;
	
	int nNUM = 0;
	
	bool bFlage = true;
	
	enum NumState oState = OK;
	
	if (*p == '-')
	{
		bFlage = false;
		p++;
	}
	else if (*p == '+')
	{
		p++;
	}
	
	while (*p != '\0')
	{
		if ((*p < '0') || (*p > '9'))
		{
			oState = ERROR;
			nNUM = 0;
			break;
		}
		
		if ((nNUM * 10)>0 
			&& (*p - '0')>0
			&& (2147483647 - (nNUM * 10) < (*p - '0')))
		{
			oState = ERROR;
			nNUM = 0;
			break;
		}

		nNUM = nNUM * 10 + (*p - '0');

		p++;
	}
	
	if (!bFlage)
	{
		nNUM = 0 - nNUM;
	}
	
	return nNUM;
}

int main()
{

	int nNum;
	nNum = stringToInt("-2147483647");
	printf("%d\n", nNum);
	return 0;
}

不要忽视容错机制,很重要




  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值