Hola, queria hacer un programa que pintase las variables que se le pinten como parametros, pudiendom ser enteros o cadenas de caracteres.
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;
}