我试图在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);
^
你能帮我正确地写这段代码吗?
最佳答案
你的伪代码应该是:
fprintf(stderr, "foo: error:");
vfprintf(stderr, format, args);
你似乎在暗示你想避免“额外”的电话。如果是这样,你可以这样做:
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);
尽管那是浪费时间和资源。