自定义printf函数
有时为了更好的配合应用开发,需要定义一个函数,传参个数又不确定的,可以参考标准库函数printf
来改造一个。
比如我们要自定义个串口打印的接口:
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
void myUart3_printf(uint16_t sendLen, char *fmt, ...)
{
va_list va;
char tempTab[256];
int len;
if (sendLen)
{
myUart3_sendArray((uint8_t *)fmt, sendLen);
}
else
{
va_start(va, fmt);
memset(tempTab, 0, sizeof(tempTab));
vsnprintf(tempTab, (int)sizeof(tempTab), fmt, va);
len = strlen(tempTab);
myUart3_sendArray((uint8_t *)tempTab, len);
va_end(va);
}
}
要点
- 头文件
#include <stdarg.h>
:用于调用va_list
、va_start
、va_end
- 头文件
#include <string.h>
:用于调用memset
- 头文件
#include <stdio.h>
:用于调用vsnprintf
该函数可以实现可变长度数组的打印、字符串和格式化字符串的打印。
- 可变长度数组的打印
uint8_t buffer[10] = {0x01, 0x01, 0x01, 0x01, 0x01}; myUart3_printf(10, buffer);
- 字符串
myUart3_printf(0, "hello world\n");
- 格式化字符串的打印
myUart3_printf(0, "this str len = %d\n", strlen("hello world\n"));