sintaxis lenguaje example ejemplos dev c arduino

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:

http://ideone.com/loTRNL

Enlace a la página man de va_copy : https://linux.die.net/man/3/va_copy