Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Zeigon en 17 de Mayo de 2004, 07:51:41 PM

Título: Problemilla Con Char*
Publicado por: Zeigon en 17 de Mayo de 2004, 07:51:41 PM
 pues estaba intentado hace una cosa q en principio pensaba q no me iba a dar problemas pero lo debo estar haciendo mal. el caso, intento unir un char * con un int, pero me da error todo el rato cuando ejecuto con el debugger.

tengo un char* q guarda una cadena y l oq quería es ir recorriendo un conjunto de nombres terminados en una sucesión de números dados por otra variable, pero esto no viene al caso.


char * a="Objeto";

for (int i = 0; i < 4; i++)
{
   printf("%s\n", strcat(a,(char *)i));  //convierto 'i' a char * para q la acepte strcat. La excepción salta en esta linea
   strcpy(a, "Objeto");
}

//Debería salir:

Objeto0
Objeto1
Objeto2
Objeto3

//La idea sería esta, pero vamos bien hecha pq esto no va



siempre me salta lo de excepción no controlada cuando lo ejecuto, así q ya aparte de lo q saque, es q el strcat no debo estar usándolo bien.

a ver si alguien puede ayudarme pq ya no caigo en q puede ser y lo mismo es alguna chorrada de punteros  (nooo) .

por cierto uso c++ con el visual studio .net.
Título: Problemilla Con Char*
Publicado por: Zeigon en 17 de Mayo de 2004, 08:23:36 PM
 vaya burrada q estaba haciendo, vamos q no sé ni como me ha salido.

el caso es q me ha venido a la mente la función atoi(), y luego en GameDev ponen varios métodos entre ellos sprintf()

por cierto q al final del post de arriba hay un artículo sobre esto de 'int a char', por si quereis echarle un ojo.


ahora tengo esto:

EDITO:


char * a = "Objeto";
char b; //Lo cual me parece un poco chapuza, un char sólo para esto

for (int i = 0; i < 4; i++)
{
   sprintf(&b, "%d", i);

   printf("%s\n", a+b));  
   strcpy(a, "Objeto"); //Ahora me salta aquí
}


ahora me salta en el strcpy, lo demás ya lo pilla bien.


gracias.
Título: Problemilla Con Char*
Publicado por: Zeigon en 17 de Mayo de 2004, 08:42:28 PM
 bueno, a esto se le llama autoayuda. ya lo he solucionado, gracias a todos :D

al final se ha quedado así:


char b; //Sigo pensando en q lo mismo se puede mejorar esta parte

for (int i = 0; i < 4; i++)
{
  sprintf(&b, "%d", i);

  printf("%s\n", "Objeto"+b));  
}

Título: Problemilla Con Char*
Publicado por: CoLSoN2 en 17 de Mayo de 2004, 09:37:54 PM
Cita de: "Zeigon"bueno, a esto se le llama autoayuda. ya lo he solucionado, gracias a todos :D

al final se ha quedado así:


char b; //Sigo pensando en q lo mismo se puede mejorar esta parte

for (int i = 0; i < 4; i++)
{
  sprintf(&b, "%d", i);

  printf("%s\n", "Objeto"+b));  
}

Citarbueno, a esto se le llama autoayuda. ya lo he solucionado, gracias a todos
de nada ;)
Título: Problemilla Con Char*
Publicado por: Zaelsius en 17 de Mayo de 2004, 09:38:07 PM
 Una mejora:



for (int i = 0; i < 4; i++)
   printf("Objeto%c\n", (char)('0' + i));

Título: Problemilla Con Char*
Publicado por: fiero en 17 de Mayo de 2004, 10:34:47 PM
 No puedes hacer esto:

char b;

sprintf(&b, "%d", i);


al 'sprintf' tienes que pasarle una cadena de caracteres que pueda contener todo el texto más un caracter de fin de cadena que el el 0x00. O sea, que tú reservas en la variable 'b' 1 char y luego el 'sprintf' te escribe 2, uno con la cifra y otro con el caracter de final de cadena \0, con lo que estás machacando memoria sin reservar.

En todo caso deberias hacer algo como:

char b[2];
sprintf(b, "%d", i); //Ojo, las cadenas van sin '&'

o escribir directamente la cifra con el printf:

printf("Objeto%d\n", i);

un saludo
Título: Problemilla Con Char*
Publicado por: sés en 17 de Mayo de 2004, 10:40:19 PM
 char b; //Sigo pensando en q lo mismo se puede mejorar esta parte

for (int i = 0; i < 4; i++)
{
 sprintf(&b, "%d", i);

 printf("%s\n", "Objeto"+b));  
}

Me extraña que esto te funciona bien. Si no te peta, lo hará.
sprintf() inserta el '\0' al final de la cadena que genera. O sea, que te estará metiendo el valor de i en b y el '\0' en la posición de memoria siguiente.

Y ya puestos, pongo mi versión optimizada del código:
for( char a[]="Objeto0"; a[6]<'4'; a[6]++ ) printf( "%s\n", a );
Título: Problemilla Con Char*
Publicado por: Zaelsius en 17 de Mayo de 2004, 10:54:34 PM
 Puliendo un más poco el código de sés:


for( char a[]="Objeto0\n"; a[6]<'4'; a[6]++ ) printf(a);
Título: Problemilla Con Char*
Publicado por: sés en 17 de Mayo de 2004, 10:57:58 PM
 
Cita de: "ZaelSiuS"Puliendo un más poco el código de sés:
Hombre, no creo que quiera en '\n' en la cadena, ¿no?
Título: Problemilla Con Char*
Publicado por: Zaelsius en 17 de Mayo de 2004, 11:06:38 PM
 Sólo me he limitado a producir la misma salida :P . Aun así yo dejaria una versión  más lenta pero reutilizable y compatible con unicode si por alguna casualidad necesita traducir el juego a chino (twist)  
Título: Problemilla Con Char*
Publicado por: DraKKaR en 17 de Mayo de 2004, 11:20:25 PM
 A ver cuando nos ponemos a usar la std::string y nos olvidamos de los malditos punteros a char.
Título: Problemilla Con Char*
Publicado por: sés en 17 de Mayo de 2004, 11:29:19 PM
 Nunca :P
Título: Problemilla Con Char*
Publicado por: Zeigon en 18 de Mayo de 2004, 01:29:21 AM
 jejeje pos gracias y eso, ahora sí q sí. teeengo q decir ,q lo del char b; bla bla, sí q lo tenía bien puesto en mi código pero se me olvidó copiar-pegar aquí cuando lo cambié. gracias anyway.

lo de los punteros y los string pues bueno, depende para qué, digo yo. los string los estoy usando en otra parte del código, de hecho 3 líneas más arriba pero vamos, q si te pide un char * pa guardar cosas, un string no puedes pasarle. vamos lo q he leido de las string es q como mucho puedes hacer string::c_str() q ya te devuelve el const char*.  además pa guardar y cosas de esas sencillitas prefiero el C clásico  :D

ya q estamos todos emocionaos con mi código pongo como saquedao al final:


char b[2];
char a[8]="Objeto";
   
for (int i = 0; i < iBuffy; i++)
{
sprintf(b, "%d", i);

strcat(a,b);

    if(ConfigFile.GetKey(cBuffy,sizeof(cBuffy), a, "nombre") != INI_OK)  //lo mismo a alguien le suena esta clase xD
   {
          log.Escribe(b, __LINE__,__FILE__);
          return 0;
    }

objetos[i] = cBuffy;
log.Escribe(objetos[i].c_str()); //aquí un string xD
strcpy(a, "Objeto");
}


es lo más optimizao q se me ha ocurrío a estas horas.
Título: Problemilla Con Char*
Publicado por: sés en 18 de Mayo de 2004, 09:55:29 AM
 Se me ocurren  un par de cambios (¿se nota que me aburro? :P)
char a[] = "Objeto";
char aux[8];
 
for( int i=0; i<iBuffy; i++ ) {
   sprintf( aux, "%s%d", a, i );

   if( ConfigFile.GetKey( cBuffy, sizeof(cBuffy), aux, "nombre" ) != INI_OK ) {
       log.Escribe( aux, __LINE__,__FILE__ );
       return 0;
   }

   objetos[i] = cBuffy;
   log.Escribe( objetos[i].c_str() );
}
Título: Problemilla Con Char*
Publicado por: Zeigon en 18 de Mayo de 2004, 06:38:32 PM
 pues ya puestos te puedes ahorrar a[]  :)


char aux[8];
 
for (int i=0; i<iBuffy; i++ )
{
sprintf( aux, "%s%d", "Objeto", i );

if( ConfigFile.GetKey( cBuffy, sizeof(cBuffy), aux, "nombre" ) != INI_OK )
{
 log.Escribe( "Error al cargar los objetos del escenario", __LINE__,__FILE__ );
 return 0;
}

objetos[i] = cBuffy;
log.Escribe( objetos[i].c_str() );
}