【问题标题】:Trouble Wrapping Printf in C Program在 C 程序中包装 Printf 时遇到问题
【发布时间】:2012-05-28 15:10:18
【问题描述】:

我正在尝试将 printf 包装在 C 程序中(嗯,实际上是 _snprintf,但这个例子更简单)并且无法让变量参数的东西工作。这是我的代码:

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

void works(void)
{
    printf("%d\n", 100);
}

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

void broken(void)
{
    wrap_printf("%d\n", 100);
}

int main(void)
{
    works();
    broken();
    return 0;
}

这是我的输出:

100
3668388

在我的代码中调用va_start 之后,args 变量看起来不错,但是当我进入C 运行时代码并且他们调用va_start 时,该值看起来很糟糕。关于我可能做错了什么有什么想法吗?

【问题讨论】:

标签: c printf


【解决方案1】:
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);

您需要拨打vprintf 而不是printfv*printf 函数理解 va_List 参数。我很惊讶你没有收到警告。

【讨论】:

  • 在 stackoverflow 上编写代码时,请务必使用正确的代码块,而不是答案中的引号。
  • 谢谢!除了 '_snprintf' 之外没有任何警告:此函数或变量可能不安全。考虑改用 _snprintf_s。
  • @user1421964 你可以定义_CRT_SECURE_NO_WARNINGS 来摆脱它。
【解决方案2】:

你传递了args,这是一个va_list,但是printf()当然直接期望参数,它无法知道它的第二个参数突然是一个va_list

您应该使用@987654321@,它确实需要va_list 并且知道如何从中提取值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2023-03-25
    相关资源
    最近更新 更多