C/Visual C - Concatenar Cadenas Punteros

 
Vista:

Concatenar Cadenas Punteros

Publicado por JoseRC (4 intervenciones) el 01/09/2007 15:49:10
Saludos, yo de nuevo , ahora tengo un problema que no se de verdad como bregarle, tengo que hacer un programa que capture 2 cadenas y que como resultado devuelva una cadena nueva con la concatenacion de ambas, la cadena nueva debe tener memoria reservada dinamicamente usando malloc, ej. cad1=Hola, cad2=Mundo.... cadf= 'Hola Mundo', no se puede utilizar strlen, stcpy, stcat.

Hasta ahora tengo esto

Código:

#include <stdlib.h>
#include <stdio.h>
/* Copia una cadena al final de la otra */

int main(void)
{
char *c1="Hola";
char* c2="Amigos";
int i=0, j=0;
/* primero nos ponemos al final de la primera cadena */
while(c1[i]!='\0'){
i++;
}
/* y despues vamos agregando caracter a caracter de la cadena que queremos agregar */
while(c2[j]!='\0'){
c1[i++]=c2[j++];
}
/* cuando terminamos de meterle todos los caracteres, colocamos el caracter de fin de cadena y la devolvemos*/
c1[i]='\0';
//return c1;
putchar(*c1);
system("pause");
}


pero esto me explota
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Concatenar Cadenas Punteros

Publicado por fernando.gomez (1603 intervenciones) el 01/09/2007 16:11:39
Pos es que le estás intentando meter más caracteres a c1 de los que tiene en su búfer. Lógico, estás accesando a partes de memoria sin inicializar, comportamiento indefinido.

Prueba aumentar el búfer:

char c1[100];

ó

char* c1 = new char[100];
...
delete [ ] c1;

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Concatenar Cadenas Punteros

Publicado por Jose (4 intervenciones) el 01/09/2007 17:46:54
Hice lo que me indicaste pero todavia me sigue explotando el programa :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Concatenar Cadenas Punteros

Publicado por NeoMitnick (11 intervenciones) el 02/09/2007 10:26:43
Hola...
probé el código y funciona correctamente haciendo los cambios que sugirió fernando, compila correctamente... salvo que la función maín debe devolver un valor de tipo entero... si tu descomentas la línea

return c1;

El compilador devolverá un error... ya que espera que se regrese un valor entero, no un puntero a char... recuerda que un programa cuando termina debe volver un 0 si todo salió bien...

Por otro lado para mostrar una cadena se usa puts no putchar... corregido quedaría así....

#include <stdlib.h>
#include <stdio.h>
/* Copia una cadena al final de la otra */

int main(void)
{
char c1[100]="Hola";
char* c2="Amigos";
int i=0, j=0;
/* primero nos ponemos al final de la primera cadena */
while(c1[i]!='\0'){
i++;
}
/* y despues vamos agregando caracter a caracter de la cadena que queremos agregar */
while(c2[j]!='\0'){
c1[i++]=c2[j++];
}
/* cuando terminamos de meterle todos los caracteres, colocamos el caracter de fin de cadena y la devolvemos*/
c1[i]='\0';
puts(c1);
system("pause");
return (0);
}

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Concatenar Cadenas Punteros

Publicado por Diego (10 intervenciones) el 02/09/2007 16:13:39
Buenas. El problema con esa solucion es que no se usa memoria dinamica como dice que debe hacerlo. Dejo 2 soluciones, una usando malloc y la otra usando realloc

PD: No los probe asi que no estoy muy seguro que funcione, pero la base esta

Salu2, Diego

Codigo con malloc:

char *xcat(char *s, char *t)
{
int i = 0, j = 0;
char *aux;

if( s == NULL || t == NULL)
return NULL;

while(s[i++]); /* da el tamaño de s */
while(t[j++]); /* da el tamaño de t */

if((aux = malloc(i + j + 1)) == NULL)
return NULL;

for(i = 0; s[i]; aux[i] = s[i], i++);
for(j = 0; t[j]; aux[i] = t[j], j++, i++);

return aux;
}

Codigo con realloc:

char *xcat(char *s, char *t)
{
int i = 0, j = 0;

if( s == NULL || t == NULL)
return NULL;

while(s[i++]); /* da el tamaño de s */
while(t[j++]); /* da el tamaño de t */

if((s = realloc(s, i + j + 1)) == NULL)
return NULL;

for(j = 0; t[j]; s[i + j] = t[j], j++);

return s;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar