创建具有一些附加功能的snprintf()
版本的最简单方法是什么,例如额外的格式说明符可以重复指定次数的以下转换?例如%6a%-3x
之类的内容会在参数列表中接受char*
参数,如果这指向字符串"My test string"
则会打印"4d 79 20 74 65 73 74 "
。关联参数始终是指向相应类型数组的指针。
这是解释格式说明符和变量长度参数列表(其类型取决于格式字符串中的格式说明符)的代码,我希望得到一些帮助,以避免重新发明轮子。
这需要采用普通的老式C语言,因为必须使用Microchip的C30编译器为PIC编译。
谢谢 - 罗恩
答案 0 :(得分:2)
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列表传递给{{ 1}}。
vsprintf
答案 1 :(得分:1)
最简单的方法可能不是您想要的答案,但它可能是最实用的解决方案:不要这样做。
而是创建自己的输出函数,写入缓冲区。
// print count bytes from buf into s, but take up no more than n-1 bytes
// returns how many bytes were (or would be) printed
int snprint_hex (char *s, size_t n, const char *buf, size_t count) {
//...
}
您的代码将更加清晰,您不必实施神秘的解析代码来处理所有printf
格式说明符。