【嵌入式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;
}