如何将字符串或整数添加到可变 printf 函数?

How to prepend a string or integer to a variadic printf function?

我有一个调试函数,它采用格式和可变数量的附加参数(就像 printf()),将它们转换为存储在缓冲区 buf 中的格式化字符串,然后发送该缓冲区到实际打印它的辅助功能:

    #include <stdio.h>
    #include <stdarg.h>

    void debug_printf(const char *fmt, ...)
    {
        char buf[100];
        va_list va;

        va_start(va, fmt);

        /* Format the string and store it in buf */
        vsnprintf(buf, sizeof(buf), fmt, va);

        /* Actually print the buf. */
        actual_print(buf);

        va_end(va);
    }

如何修改此函数以在结果输出前添加一个字符串?例如,像 DBG: 这样的 header 这样如果我调用 debug_printf("test1") 结果将打印 DBG: test1.

或者,我如何修改此函数采用可变整数(函数的 return 值)并以某种方式将其作为字符串添加到结果输出中?例如,如果我有一个函数 rng() returned 一个随机整数,我可能会调用 debug_printf("test2") 并且结果会打印类似 3572 test2 的东西,假设 rng() returned 整数值 3572.

对于这两种情况,理想情况下,解决方案将修改 debug_printf() 的 body 而不是将其包装在另一个函数 and/or 预处理器宏中。

EDIT:看来我忘记了重要的一点。出于性能原因,我非常希望只在 debug_printf() 中调用 actual_printf() 一次 。否则是的,调用它两次将是一个相当简单的解决方案:一次使用 header ,一次使用实际格式化的字符串。抱歉!

无需寻找复杂的方法在可变参数列表中插入另一个参数,您只需在代码的开头添加一个简单的 printf:
printf("%d ",rng());

打印到 buf 中,无论你想添加什么,就是这样。

#include <stdio.h>
#include <stdarg.h>

void debug_printf(const char *fmt, ...)
{
    char buf[100];
    va_list va;

    va_start(va, fmt);

    int n = snprintf(buf, sizeof(buf), "DBG: ");

    /* Format the string and store it in buf */
    vsnprintf(buf + n, sizeof(buf) - n, fmt, va);

    /* Actually print the buf. */
    actual_print(buf);

    va_end(va);
}

无需使用固定尺寸。联机帮助页有一个示例来计算缓冲区的正确大小以使用 malloc():

分配

http://man7.org/linux/man-pages/man3/printf.3.html