创建printf的自定义版本

时间:2012-07-02 23:11:25

标签: c customization printf optional-parameters

创建具有一些附加功能的snprintf()版本的最简单方法是什么,例如额外的格式说明符可以重复指定次数的以下转换?例如%6a%-3x之类的内容会在参数列表中接受char*参数,如果这指向字符串"My test string"则会打印"4d 79 20 74 65 73 74 "。关联参数始终是指向相应类型数组的指针。

这是解释格式说明符和变量长度参数列表(其类型取决于格式字符串中的格式说明符)的代码,我希望得到一些帮助,以避免重新发明轮子。

这需要采用普通的老式C语言,因为必须使用Microchip的C30编译器为PIC编译。

谢谢 - 罗恩

2 个答案:

答案 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格式说明符。