背景:在嵌入式开发中,有时候我们在协议中发送或者收到的数字都是十进制数字,而我们在人机交互时,需用通过字符串类型来显示该十进制数字,这就经常需要对十进制数字和数字字符串进行相互转换。
说明:下面给出的4个工具函数,在使用时可以直接调用。以下工具函数中,说明了函数的功能,函数参数以及函数的返回值。并且下面的函数原型和函数实现都是我在嵌入式开发中经常使用的,而不是所有场景通用的(比如嵌入式中常用u8类型,即unsigned char,一般不会出现负数)。
1.计算10的n次方
1. /************************************* 2. *函数名称:get_10_n 3. *函数功能:输入一个数字n,计算10的n次方 4. *函数参数:大于等于0的数字 5. *函数返回:10的n次方结果 6. *************************************/ 7. int get_10_n(int n) 8. { 9. int i = 0; 10. int ret = 10; 11. 12. if (n == 0) 13. { 14. return 1; 15. } 16. 17. for (i = 0; i < (n - 1); i++) 18. { 19. ret = 10 * ret; 20. } 21. 22. return ret; 23. }
2.判断一个十进制数字是几位数(测试用例 00014 10004 11982)
1. /******************************************** 2. *函数名称:get_dec_digit 3. *函数功能:输入一个十进制数num,计算num是几位数 4. *函数参数:十进制正整数 5. *函数返回:正整数的位数 6. ********************************************/ 7. int get_dec_digit(int num) 8. { 9. int ret = 0; 10. 11. while ((num / 10) != 0) 12. { 13. num = num / 10; 14. ret++; 15. } 16. 17. return (ret + 1); 18. }
3.数字字符串转十进制
1. /******************************************** 2. *函数名称:str_to_dec 3. *函数功能:把一个数字字符串转为十进制正整数 4. *函数参数:一个数字字符串 5. *函数返回:十进制正整数 6. ********************************************/ 7. int str_to_dec(unsigned char* str) 8. { 9. int i = 0; 10. int len = 0; 11. int ret = 0; 12. 13. if (str == NULL) 14. { 15. return 0; 16. } 17. 18. len = strlen((const char*)str); 19. 20. for (i = 0; i < len; i++) 21. { 22. ret = ret + (str[i] - '0') * get_10_n(len - 1 - i); 23. } 24. 25. return ret; 26. }
4.数字转数字字符串 (要在主调函数释放内存)
1. /******************************************************************************** 2. *函数名称:dec_to_str 3. *函数功能:十进制数字转数字字符串 4. *函数参数:unsigned char** buf 用于返回字符串内存的地址,该内存需要在主调函数释放 5. * int num 十进制数字 6. *函数返回:void 7. ********************************************************************************/ 8. void dec_to_str(unsigned char** buf, int num) 9. { 10. unsigned char* buf_temp = NULL; 11. 12. if (num < 0) 13. { 14. *buf = buf_temp; 15. return; 16. } 17. //被调函数分配内存,一定要在主调函数释放,防止内存泄漏 18. buf_temp = (unsigned char*)malloc(get_dec_digit(num) + 1); 19. if (buf_temp == NULL) 20. { 21. *buf = buf_temp; 22. return; 23. } 24. sprintf((char *)buf_temp, "%d", num); 25. buf_temp[get_dec_digit(num)] = '\0'; 26. 27. *buf = buf_temp; 28. }