【嵌入式C语言】常用工具函数之数字字符串与十进制数字转换函数

背景:在嵌入式开发中,有时候我们在协议中发送或者收到的数字都是十进制数字,而我们在人机交互时,需用通过字符串类型来显示该十进制数字,这就经常需要对十进制数字和数字字符串进行相互转换。

说明:下面给出的4个工具函数,在使用时可以直接调用。以下工具函数中,说明了函数的功能,函数参数以及函数的返回值。并且下面的函数原型和函数实现都是我在嵌入式开发中经常使用的,而不是所有场景通用的(比如嵌入式中常用u8类型,即unsigned char,一般不会出现负数)。

1.计算10的n次方

/*************************************
*函数名称:get_10_n
*函数功能:输入一个数字n,计算10的n次方
*函数参数:大于等于0的数字
*函数返回:10的n次方结果
*************************************/
int get_10_n(int n)
{
	int i = 0;
	int ret = 10;

	if (n == 0)
	{
		return 1;
	}

	for (i = 0; i < (n - 1); i++)
	{
		ret = 10 * ret;
	}

	return ret;
}

2.判断一个十进制数字是几位数(测试用例 00014 10004 11982)

/********************************************
*函数名称:get_dec_digit
*函数功能:输入一个十进制数num,计算num是几位数
*函数参数:十进制正整数
*函数返回:正整数的位数
********************************************/
int get_dec_digit(int num)
{
	int ret = 0;

	while ((num / 10) != 0)
	{
		num = num / 10;
		ret++;
	}
	
	return (ret + 1);
}

3.数字字符串转十进制

/********************************************
*函数名称:str_to_dec
*函数功能:把一个数字字符串转为十进制正整数
*函数参数:一个数字字符串
*函数返回:十进制正整数
********************************************/
int str_to_dec(unsigned char* str)
{
	int i = 0;
	int len = 0;
	int ret = 0;

	if (str == NULL)
	{
		return 0;
	}

	len = strlen((const char*)str);

	for (i = 0; i < len; i++)
	{
		ret = ret + (str[i] - '0') * get_10_n(len - 1 - i);
	}

	return ret;
}

4.数字转数字字符串 (要在主调函数释放内存)

/********************************************************************************
*函数名称:dec_to_str
*函数功能:十进制数字转数字字符串
*函数参数:unsigned char** buf 用于返回字符串内存的地址,该内存需要在主调函数释放
*         int num 十进制数字
*函数返回:void
********************************************************************************/
void dec_to_str(unsigned char** buf, int num)
{
	unsigned char* buf_temp = NULL;

	if (num < 0)
	{
		*buf = buf_temp;
		return;
	}
	//被调函数分配内存,一定要在主调函数释放,防止内存泄漏
	buf_temp = (unsigned char*)malloc(get_dec_digit(num) + 1);
	if (buf_temp == NULL)
	{
		*buf = buf_temp;
		return;
	}
	sprintf((char *)buf_temp, "%d", num);
	buf_temp[get_dec_digit(num)] = '\0';

	*buf = buf_temp;
}
posted @ 2022-03-19 13:20  Mindtechnist  阅读(103)  评论(0编辑  收藏  举报  来源