Lo he hecho en DevC++ y funciona. Uno de los parámetros es un string del tipo "para escribir parametro1 %d parametro 2 %s", y el resto de apraemtros son los propios a pintar.
Lo que hago es ver en la cadena si hay %d o %s y enc ada caso hago un printf con %s o %d. Para ir sacando los parametros (que son opcionales) utilizo las funciones va_arg, va_start.
El problema viene cuando el mismo código lo ejecuto en VisualC++, no funciona!
Se me escapa por qué en DevC++ si y en VisualC++ no.
Un saludo.
Código:
#include <stdio.h> #include <stdarg.h> #include <string.h> int cuantos_parametros(const char* texto) { int i; int numero_parametros = 0; for (i=0;i<strlen(texto);i++) { if (texto[i] == '%'){numero_parametros++;} } return(numero_parametros); } char tipo_parametro(const char* texto, int numero_de_parametro) { int i=0; int cuantos_encontrados = 0; int encontrado = 0; char tipo; while ((i<strlen(texto)) && (encontrado == 0)) { if (texto[i] == '%') { cuantos_encontrados++; if (cuantos_encontrados == numero_de_parametro) { encontrado = 1; if (texto[i+1] == 'd'){tipo = 'd';} if (texto[i+1] == 's'){tipo = 's';} } } i++; } return(tipo); } void syslog(int no_sirve_fichero, const char *texto, ...) { int i; int numero_parametros; int vald; const char* vals; char tipo; va_list vl; printf ("%s\nparametros: ", texto); /* Se pinta el texto */ numero_parametros = cuantos_parametros(texto); va_start(vl,numero_parametros); for (i=0;i<numero_parametros;i++) /* Se pinta cada parametro */ { tipo = tipo_parametro(texto, i+1);; if (tipo == 'd') /* Si es int... */ { vald=va_arg(vl,int); printf ("%d ",vald); } else /* Si es string */ { vals=va_arg(vl,const char*); printf ("%s ",vals); } } va_end(vl); printf ("\n\n"); } int main () {int g; int totalChecksum = 0; const char *cadena = "hola"; syslog( 2 | 1, "\n NOTICE(rcimDataChecksumTopology): %d %s\n",totalChecksum, 0, cadena); scanf("%d\n", g); return 0; }