首页 > 解决方案 > 如何将字符串或整数添加到可变参数 printf 函数?

问题描述

我有一个调试函数,它采用格式和可变数量的附加参数(就像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,假设rng()返回整数值3572

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

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

标签: cvariadic-functions

解决方案


打印到 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


推荐阅读