要輸出格式化的調試輸出,我寫了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 –