2010-02-01 16 views
5
void printLine(const wchar_t* str, ...) 
{ 
    // have to do something to make it work 
    wchar_t buffer[2048];   
    _snwprintf(buffer, 2047, ????); 
    // work with buffer 
} 

printLine(L"%d", 123); 

me trataron¿Es posible pasar una llamada Clipsis directamente?

va_list vl; 
    va_start(vl,str); 

y cosas así, pero no encontré una solución.

+0

Fwiw la palabra es 'puntos suspensivos' no 'elipse'. –

Respuesta

9

Aquí hay un código C simple que hace esto, tendrá que incluir stdarg.h para que esto funcione.

 
void panic(const char *fmt, ...){ 
    char buf[50]; 

    va_list argptr; /* Set up the variable argument list here */ 

    va_start(argptr, fmt); /* Start up variable arguments */ 

    vsprintf(buf, fmt, argptr); /* print the variable arguments to buffer */ 

    va_end(argptr); /* Signify end of processing of variable arguments */ 

    fprintf(stderr, buf); /* print the message to stderr */ 

    exit(-1); 
} 

La invocación típica sería

 
panic("The file %s was not found\n", file_name); /* assume file_name is "foobar" */ 
/* Output would be: 

The file foobar was not found 

*/ 

Espero que esto ayude, Saludos, Tom.

+0

Pensé que había intentado esto, pero ahora funciona. Muchas gracias. – Totonga

+1

Su ejemplo es peligroso. 'vsprintf' no protege contra un desbordamiento de búfer, y' fprintf (stderr, buf) 'está pidiendo un ataque de cadena de formato si' buf' contiene caracteres incrustados '%'. Debería utilizar 'vsnprintf' y' fprintf (stderr, "% s", buf) 'o' fputs (buf, stderr) '. – jamesdlin

+1

@Jamesdlin: Ese fue un ejemplo, para ilustrar el código y la semántica, pero su observación es correcta ... ¡gracias! :) – t0mm13b

2

Normalmente se llama a una versión variable args de la función, que acepta va_list. Por ejemplo, _snwprintf llamadas internas _vsnwprintf; intenta llamar eso.

5

Lo que quiere utilizar es vsprintf acepta el argumento va_list y hay un código de muestra en MSDN en el enlace.

EDIT: Deberías considerar _vsnprintf que te ayudará a evitar los problemas de desbordamiento del búfer que vsprintf creará felizmente.

2

Otras personas ya lo han señalado al vprintf -familia de funciones, pero esto también (no sorprendentemente) se responde mediante las preguntas frecuentes comp.lang.c, si desea familiarizarse con las otras entradas de preguntas frecuentes. (Están vale la pena leer, la OMI.)

How can I write a function that takes a format string and a variable number of arguments, like printf, and passes them to printf to do most of the work?

+0

Busqué un tiempo y no pude encontrar una solución por mi cuenta. Probable porque busqué las cosas/palabras equivocadas. – Totonga

Cuestiones relacionadas