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 
#include 

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;
}

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




你可能感兴趣的:(C语言)