为了输出格式化的调试信息,我编写了一个
直接调用
vsfprint
的包装器。现在,我想为输出缓冲区分配恰好足够的内存,而不是只声明一个随意的高缓冲区大小(这是一个小型嵌入式平台(ESP8266))。为此,我迭代变量参数,直到发现NULL。
如果我没有忘记在每次调用中添加(char *)NULL
参数,这个方法就可以正常工作。所以,我想创建另一个包装器,一个函数,只转发所有参数并添加(char *) NULL
参数:
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // malloc
void write_log(const char *format, ...) {
char* buffdyn;
va_list args;
// CALC. MEMORY
size_t len;
char *p;
if(format == NULL)
return;
len = strlen(format);
va_start(args, format);
while((p = va_arg(args, char *)) != NULL)
len += strlen(p);
va_end(args);
// END CALC. MEMORY
// ALLOCATE MEMORY
buffdyn = malloc(len + 1); /* +1 for trailing \0 */
if(buffdyn == NULL) {
printf("Not enough memory to process message.");
return;
}
va_start(args, format);
//vsnprintf = Write formatted data from variable argument list to sized buffer
vsnprintf(buffdyn, len, format, args);
va_end(args);
printf("%s\r\n",buffdyn);
free(buffdyn);
}
void write_log_wrapper(const char *format, ...) {
va_list arg;
va_start(arg, format);
write_log(format,arg,(char *)NULL);
va_end(arg);
}
int main()
{
const char* sDeviceName = "TEST123";
const char* sFiller1 = "12345678";
write_log_wrapper("Welcome to %s%s", sDeviceName,sFiller1);
write_log("Welcome to %s%s", sDeviceName,sFiller1, (char *)NULL);
return 0;
}
直接调用
write_log()
函数是可以正常工作的(如果您不忘记NULL参数)。调用write_log_wrapper()
函数只会显示第一个参数,然后在输出中添加了“(nu”(垃圾?)。
我做错了什么?这是一种好的方法来实现我首先想要做的吗?
谢谢。
stdout
,为什么不直接使用vprintf
?如果要写入文件,请使用vfprintf
。这样,在您的代码中就没有缓冲区分配,您也不必处理有多少参数或需要多大的缓冲区的问题。 - Dark Falconchar *
传递的以 NUL 结尾的字符串。如果你得到一个int
或double
,会怎样呢? - Andrew Henle