Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemilla Con Char*

Iniciado por Zeigon, 17 de Mayo de 2004, 07:51:41 PM

« anterior - próximo »

Zeigon

 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.
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

Zeigon

 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.
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

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));  
}

eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

CoLSoN2

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 ;)
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Zaelsius

 Una mejora:



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


fiero

 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
www.videopanoramas.com Videopanoramas 3D player

sés

 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 );
Soy indeciso... ¿o no?

Zaelsius

 Puliendo un más poco el código de sés:


for( char a[]="Objeto0\n"; a[6]<'4'; a[6]++ ) printf(a);

sés

 
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?
Soy indeciso... ¿o no?

Zaelsius

 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)  

DraKKaR

 A ver cuando nos ponemos a usar la std::string y nos olvidamos de los malditos punteros a char.

sés

Soy indeciso... ¿o no?

Zeigon

 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.
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

sés

 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() );
}
Soy indeciso... ¿o no?

Zeigon

 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() );
}
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.