创建具有一些附加功能(例如用于重复以下转换指定次数的附加格式说明符)的 snprintf()
版本的最简单方法是什么?例如,像 %6a%-3x
这样的东西会接受参数列表中的 char*
参数,如果它指向字符串 "My test string"
将打印 "4d 79 20 74 65 73 74 "
。关联的参数始终是指向适当类型的数组的指针。
这是解释格式说明符和可变长度参数列表(其类型取决于格式字符串中的格式说明符)的代码,我需要一些帮助,以避免重新发明轮子。
这需要使用普通的老式 C 语言,因为它必须使用 Microchip 的 PIC C30 编译器进行编译。
谢谢 - 罗文
最佳答案
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
之前“拦截”格式字符串,并将您自己的语法扩展为正确的格式说明符语法,然后传递新的格式说明符和变量参数列表到 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);
}
关于创建 printf 的自定义版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302393/