要输出格式化的调试输出,我写了vsfprint
的包装。现在,我想为输出缓冲区分配足够的内存,而不是声称一个随机的高缓冲区大小(这是一个小型嵌入式平台(ESP8266))。为此,我遍历可变参数,直到找到NULL。C可变包装
这工作正常,但我不会忘记给每个呼叫添加(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'),则同样如下所示。然后,在你的代码中根本没有缓冲区分配,你不必处理搞清楚有多少个参数或者一个缓冲区有多大。 –
您忽略了传递的参数之一不是通过'char *'传递的NUL终止字符串的可能性。如果你得到一个'int'或者'double',会怎么样? –
...或者带有%p的NULL –