0.前情提要
这是在搞STM32开发时遇到的一个问题,要将数字通过串口发送给上位机,但是HAL库中的HAL_UART_Transmit
函数只接受uint8_t *
类型的参数,因此我们需要通过一个函数先将数值类型变量转换为char *
字符串,再强制类型转换为uint8_t *
类型的数组。经过上网查询,我发现sprintf
函数与snprintf
函数可以方便的解决这个问题。
1.直!接!来!吧!
该函数的原型为int sprintf(char *dest, const char *format, ...);
,其中*dest
为格式化字符串的缓冲区,*format
为格式化字符串(后面的参数用法和printf
函数几乎一样,可以理解为该函数就让是printf
函数原本输出到屏幕上的内容输出到*dest
中。)
示例代码:
点击查看代码
char* intToString(int num) {static char buffer[20]; // 静态数组,足够存储32位整数snprintf(buffer, sizeof(buffer), "%d", num);return buffer;
}
该方法有可能输出内容太长导致缓冲区溢出,不过对于一般的应用场景来说足够用了。
为了防止这种状态的发生,可以使用snprintf()
函数,该函数的原型为int snprintf ( char * str, size_t size, const char * format, ... );
,其中size
参数为要写入的字符的最大数目。如果格式化后的字符串长度超过了size-1
,则snprintf()
只会写入size-1
个字符,并在字符串的末尾添加一个空字符(\0
)以表示字符串的结束。
这两个函数的返回值规则是一样的:
- 如果成功,返回将要写入的字符数(不包括结尾的空字符),即使这个值大于
size
。 - 如果发生编码错误,返回负值。
先写这么多吧我要睡了明天怎么还有早八高数啊啊啊啊啊