Um formatierte Debugausgabe auszugeben, habe ich einen Wrapper für vsfprint
geschrieben. Jetzt wollte ich genau genug Speicher für den Ausgabepuffer reservieren, anstatt nur eine zufällige hohe Puffergröße zu beanspruchen (es ist eine kleine eingebettete Plattform (ESP8266)). Dazu iteriere ich die Variablenargumente, bis ein NULL gefunden wird.C variadic wrapper
Das funktioniert gut, vorausgesetzt, dass ich nicht vergessen, einen (char *)NULL
Parameter zu jedem Anruf hinzuzufügen. So, dachte ich, lassen Sie einen anderen Wrapper erstellen, eine Funktion, die nur alle Argumente weiterleitet und fügt eine (char *) NULL
Parameter:
#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;
}
Aufruf der write_log()
Funktion direkt einwandfrei funktioniert (wenn Sie nicht den NULL-Parameter vergessen). Rufen Sie die write_log_wrapper()
Funktion wird nur den ersten Parameter angezeigt, und fügt dann ein "(nu" (Müll?) Zum Ausgang.
Was mache ich falsch? Ist dies ein guter Weg, um zu nähern, was ich anstrebe tun in erster Linie?
Dank.
Wenn Sie vorhaben, es auf 'stdout' zu schreiben, warum benutzen Sie nicht einfach' vprintf'? Dasselbe gilt, wenn Sie in eine Datei schreiben wollen (benutzen Sie 'vfprintf'). Dann gibt es überhaupt keine Pufferzuweisung in Ihrem Code und Sie müssen nicht herausfinden, wie viele Argumente oder wie groß ein Puffer ist. –
Sie ignorieren die Möglichkeit, dass eines der übergebenen Argumente nicht eine NUL-terminierte Zeichenfolge ist, die über ein 'char *' übergeben wird. Was ist, wenn Sie ein "int" oder ein "double" bekommen? –
... oder ein NULL mit% p –