gpt4 book ai didi

c - 如何编写一个 vfprintf 包装器,为格式说明符添加前缀并将新格式说明符传递给 C89 中的 vfprintf?

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:29 25 4
gpt4 key购买 nike

我正在尝试围绕 vfprintf 函数编写一个包装器,但要求我想为格式说明符添加一个前缀,然后将新的格式说明符传递给 vfprintf.

现在我不知道该怎么做,但我已经在下面的代码中捕捉到了我的意图。

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

void err(const char *format, ...)
{
va_list args;
va_start(args, format);
vfprintf(stderr, "foo: error:" format, args);
va_end(args);
}

int main()
{
err("%s: %d\n", "Transaction failed with error code", 42);
return 0;
}

您可以在上面的代码中看到,我想将 "foo: error" 作为格式说明符的前缀,然后将其传递给 vprintf。当然,此代码会导致编译时错误,因为此代码无效。它只捕捉了我想要实现的目标的意图。

lone@debian:~/lab/c$ gcc -std=c89 -Wall -Wextra -pedantic vfprintf-wrapper.c 
vfprintf-wrapper.c: In function ‘err’:
vfprintf-wrapper.c:8:36: error: expected ‘)’ before ‘format’
vfprintf(stderr, "foo: error:" format, args);
^
vfprintf-wrapper.c:8:5: error: too few arguments to function ‘vfprintf’
vfprintf(stderr, "foo: error:" format, args);
^

你能帮我正确写这段代码吗?

最佳答案

你的伪代码 vfprintf(stderr, "foo: error:"format, args); 应该是:

fprintf(stderr, "foo: error:");
vfprintf(stderr, format, args);

您似乎表示要避免“额外的”fprintf 调用。如果是这样,那么您可以这样做:

char *fail = malloc(sizeof "foo: error:" + strlen(format));
if ( !fail )
exit(EXIT_FAILURE);
strcpy(fail, "foo: error:");
strcat(fail, format);

vfprintf(stderr, fail, args);

free(fail);

虽然那会浪费时间和资源。

关于c - 如何编写一个 vfprintf 包装器,为格式说明符添加前缀并将新格式说明符传递给 C89 中的 vfprintf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31911195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com