lenguaje - Contenedor para printf
printf y scanf en dev c++ (1)
Estoy codificando bajo Arduino y me gustaría desarrollar la función de formateo de impresión en serie, así que estoy tratando de usar sprintf de buffer de tamaño desconocido. Básicamente, podemos evitar hablar sobre Arduino y su salida en serie y considerar escribir texto en un búfer y luego imprimirlo usando printf . He intentado esto:
#include <stdio.h>
#include <stdarg.h>
void printf0( const char* format, ... ) {
va_list args;
va_start(args, format);
vprintf(format, args);
va_end( args );
}
void printf1(const char* format,...) {
va_list args;
va_start(args, format);
char buf[vsnprintf(NULL, 0, format, args)];
sprintf(buf, format, args);
printf(buf);
va_end(args);
}
int main()
{
printf0("Hello, %d!/n", 15);
printf1("Hello, %d!/n", 15);
return 0;
}
printf0 función printf0 es un ejemplo preciso que encontré aquí . Mis intentos son la función printf1 , que produce un número impredecible. Ejemplo de salida del programa anterior es:
Hello, 15!
Hello, 860799736!
args es una va_list , por lo que no puedes llamar a sprintf con ella. Tienes que usar vsprintf o vsnprintf :
sprintf(buf, format, args);
debiera ser
vsnprintf(buf, sizeof buf, format, args);
También debe agregar 1 al tamaño de buf para el 0-terminator de la cadena:
char buf[vsnprintf(NULL, 0, format, args) + 1];
Parece que la primera llamada a vsnprintf cambia args , por lo que debes agregar
va_end(args);
va_start(args, format);
entre las 2 llamadas: http://ideone.com/5YI4Or
Parece que la primera llamada a vsnprintf cambia args , pero no debe invocar va_start dos veces. Debería usar va_copy en va_copy lugar, así que agregue
va_list args2;
va_copy(args2, args);
después de inicializar args . Además, no olvides llamar a va_end(args2); también:
Enlace a la página man de va_copy : https://linux.die.net/man/3/va_copy