es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se utiliza printf con args en funciones variádicas?

Necesito una función que funcione como printf, pero haga algunos cambios en la cadena fmt: por ejemplo, agregar al principio una cadena que contenga la fecha y hora, pero el resto, lo mantendré igual que printf

void simple_printf(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    va_end(args);

    /* hice algunos cambios en fmt, concatené cadena,...*/

    printf(fmt, ...);
}

Aquí está el código que estoy haciendo. Como puedes ver, deseo cambiar la cadena fmt, pero después llamar al printf o sprintf ‘estándar’, pasando los parámetros, una especie de bypass.

¿Esto es posible?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar una función como simple_printf. Un enfoque sería utilizar va_copy para copiar la lista de argumentos args antes de realizar cualquier cambio en fmt. Después de realizar los cambios en fmt, se puede utilizar vprintf o vsprintf para formatear la salida con la cadena de formato modificada y la lista de argumentos copiada. Aquí hay un ejemplo de implementación:

    #include <stdio.h>
    #include <stdarg.h>
    #include <time.h>
    
    void simple_printf(const char* fmt, ...)
    {
        va_list args1, args2;
        va_start(args1, fmt);
        va_copy(args2, args1);
    
        time_t t = time(NULL);
        struct tm tm = *localtime(&t);
        char datetime[20];
        strftime(datetime, sizeof(datetime), "[%Y-%m-%d %H:%M:%S] ", &tm);
    
        char modified_fmt[1000];
        snprintf(modified_fmt, sizeof(modified_fmt), "%s%s", datetime, fmt);
    
        vprintf(modified_fmt, args2);
    
        va_end(args1);
        va_end(args2);
    }
    

    Nota que esta implementación utiliza snprintf para concatenar la cadena de fecha y hora (datetime) y fmt en modified_fmt. El tamaño de modified_fmt se establece en 1000, lo cual debería ser suficiente para la mayoría de los casos, pero es posible que necesites ajustarlo según tus necesidades.</time.h></stdarg.h></stdio.h>

Comments are closed.