创建 printf 的自定义版本

标签 c customization printf optional-parameters

创建具有一些附加功能(例如用于重复以下转换指定次数的附加格式说明符)的 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/

相关文章:

C++:将一个操作数保存在寄存器中带来了惊人的加速

R字符串操作: How could i optimize this one?

push-notification - Xamarin Android 使用 SetSound 作为通知 channel 在通知上播放自定义声音

php - Prestashop - 如何将自定义输入字段添加到产品自定义并写入数据库

css - 我如何实现类似 Orkut 的用户工具来更改站点颜色和样式?

c - 想要 printf 的解决方案

c - 将项目从 64 位移植到 32 位时 : float changed to long double gives error for %f

c - realloc:反向指针数组?

C公式帮助圆形定位

c - 我的函数超出了字符串的长度