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