vsprintf是您正在寻找的。它允许您编写自己的类似 sprintf 的函数,该函数接受可变数量的参数,然后让您在调用之前执行所需的操作。
这是一个示例,我使用它来实现我自己的 printf 到嵌入式设备中的 USB 端点:
#include <stdarg.h>
void uprintf(char *fmt, ...) {
va_list args;
va_start(args, fmt);
vsprintf(str_buffer, fmt, args);
usb_write(str_buffer);
va_end(args);
}
在您的情况下,您可以在调用之前“拦截”格式字符串vsprintf
并将您自己的语法扩展为正确的格式说明符语法,然后将新的格式说明符和变量 arg 列表传递给vsprintf
.
void your_printf(char *fmt, ...) {
char new_fmt_string[1024]; /* make sure you allocate enough space */
va_list args;
/* here, do your transformation on the fmt string */
va_start(args, new_fmt_string);
vsprintf(str_buffer, new_fmt_string, args);
/* now take your fully formatted string and do something with it */
/* then clean up */
va_end(args);
}