可变参数函数无法正确传递第一个参数

时间:2019-04-12 00:25:31

标签: c printing variadic-functions

我使用了可变参数函数来包装col=df.drop('category',1) s=col.groupby(col.columns.str.findall(r'\d+').str[0],axis=1).prod().sum(1) s/df.filter(like='weight').sum(1) Out[33]: 0 67.108014 1 30.759168 2 86.160444 3 37.814871 dtype: float64 (或printf)。

以下代码有效,除了在vprintf的第一个可变参数上犯错误。另外,直接放置字符串会更改ASCII字符,但由于消息仍然是随机的,因此不能解决该问题。

它打印的是

warning_printf

代替

[Warning]
          ®¯$ address: 0x87afae8a

警告一词的颜色正确(无论如何都无所谓)。但是[Warning] Failed to initialize setting address: 0x87afae8a 似乎没有正确传递。我测试了向此函数添加更多变量。除了仅第一个可变参数msg_warn外,它们都工作正常。

我的代码有什么问题?

msg_warn

在线编译器:link

1 个答案:

答案 0 :(得分:2)

您需要将va_list传递给期望它们的函数-与v*printf()函数类似。

void colorful_vprintf(const char* header, const char* color, const char* fmt, va_list args)
{
    printf("[%s%s%s] ", color, header, RESET_ANSI_COLOR);
    vprintf(fmt, args);
}

void colorful_printf(const char* header, const char* color, const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    colorful_vprintf(header, color, fmt, args);
    va_end(args);
}

void warning_vprintf(const char* fmt, va_list args)
{
    colorful_vprintf("Warning", WARNING_COLOR, fmt, args);
}

void warning_printf(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    warning_vprintf(fmt, args);
    va_end(args);
}

*_vprintf函数可以完成实际工作;具有省略号的函数只需获取va_list作为参数,并将其传递给*_vprintf()函数。 这是printf()函数家族的接口(包装器)的通用模式。