如何在可变参数printf函数前加上字符串或整数?

时间:2018-11-01 21:05:29

标签: c variadic-functions

我有一个调试函数,该函数采用格式和可变数量的附加参数(就像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:这样的标题,这样,如果我调用debug_printf("test1"),结果将显示DBG: test1

或者,如何修改此函数采用变量整数(函数的返回值),并以某种方式将其作为字符串添加到结果输出中?例如,如果我有一个返回随机整数的函数rng(),我可能会调用debug_printf("test2"),并且假设3572 test2返回了整数值{ {1}}。

对于这两种情况,理想的解决方案都是修改rng()的主体,而不是将其包装在另一个函数和/或预处理器宏中。

编辑:看来我忘记了一个重点。出于性能原因,我非常希望仅在3572内致电debug_printf()一次。否则,调用它两次将是一个相当简单的解决方案:一次使用标头,再一次使用实际格式化的字符串。抱歉!

2 个答案:

答案 0 :(得分:2)

将任何您想添加的内容打印到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

答案 1 :(得分:0)

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