2

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

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

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

谢谢 - 罗文

4

2 回答 2

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 列表传递给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);
}
于 2012-07-03T00:11:20.333 回答
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格式说明符。

于 2012-07-03T00:16:09.087 回答