/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Concatenar Cadenas Punteros

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
jose_c27



Registrado: 31 Ago 2007
Mensajes: 10

MensajePublicado: 01/09/2007 6:22 am
Título: Concatenar Cadenas Punteros

Saludos, yo de nuevo Very Happy , 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
Volver arriba
Keeper



Registrado: 13 Abr 2006
Mensajes: 17

MensajePublicado: 01/09/2007 8:03 am
Título: Concatenar

Hola, tu problema esta en que no puedes "agregar" mas caracteres a un arreglo definido con un tamaño, la solucion a esto es crear otro arreglo con la suma de caracteres de ambas cadenas, te dejo el codigo de una función que escribi:
Código:
char * Concatena(char *String1, char *String2){
   char *String;
   int i,j,i1,i2,tamano;
   for(i1 = 0; String1[i1]!='\0';i1++);
   i1--;
   for(i2 = 0; String2[i2]!='\0';i2++);
   i2--;
   tamano = i1+i2;
   String = (char *)malloc(tamano+1);
   for(j = 0,i = 0; String1[j]!='\0'; j++,i++)
         String[i] = String1[i];
   for(j = 0; String2[j]!='\0'; j++,i++)
         String[i] = String2[j];
    String[i]='\0';
   return String;
}
Volver arriba
jose_c27



Registrado: 31 Ago 2007
Mensajes: 10

MensajePublicado: 01/09/2007 8:18 am
Título:

Lo puse de la siguiente manera pero solamente me tira una "H" en la pantalla

Código:

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
   char *String1;
   char *String2;     
   char *String;
   int i,j,i1,i2,tamano;
   
   String1="Hola";
   String2="Mundo";
       
   for(i1 = 0; String1[i1]!='\0';i1++);
   i1--;
   for(i2 = 0; String2[i2]!='\0';i2++);
   i2--;
   tamano = i1+i2;
   String = (char *)malloc(tamano+1);
   for(j = 0,i = 0; String1[j]!='\0'; j++,i++)
         String[i] = String1[i];
   for(j = 0; String2[j]!='\0'; j++,i++)
         String[i] = String2[j];
    String[i]='\0';
//   return String;
printf("%c\n",*String);
system("pause");
}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 01/09/2007 8:23 am
Título:

Te falta la llamada a malloc para reservar un bloque de memoria con espacio suficiente para almacenar las dos cadenas mas el caracter '\0'.

En C++ seria mas o menos asi:
Código:
#include <cstdio>
#include <cstdlib>

using namespace std;

int main()
{
   char *c1 ="Hola,";
   char *c2 =" mundo";
   
   char *p, *q, *res;
   int num_chars;
   
   // Calcular el numero de caracteres de las cadenas
   for (num_chars = 0, p = c1; *p != '\0'; num_chars++, p++)
      ;
   for (p = c2; *p != '\0'; num_chars++, p++);
      ;
   
   // Reservar el espacio mas un caracter para el '\0'
   res = (char *) malloc(num_chars + 1);
   
   // Copiar las cadenas
   for (p =res, q = c1; (*p = *q) != '\0'; p++, q++)
      ;
   for (q = c2; (*p = *q) != '\0'; p++, q++)
      ;
   
   printf("Resultado == \"%s\"\n", res);
   free(res);
   
   return 0;
}



Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Keeper



Registrado: 13 Abr 2006
Mensajes: 17

MensajePublicado: 01/09/2007 8:26 am
Título: re

Tu error esta en el printf, tu pusiste printf("%c\n",*String);, lo que haces es mandar a imprimir un solo cacarter y ademas tu estas mandando mal la cadena (*String), cuando debe ser:

Código:
printf("%s\n",String);
Volver arriba
jose_c27



Registrado: 31 Ago 2007
Mensajes: 10

MensajePublicado: 01/09/2007 8:32 am
Título: Re: re

Perdona tenias razon my bad Wink

Keeper escribió:
Tu error esta en el printf, tu pusiste printf("%c\n",*String);, lo que haces es mandar a imprimir un solo cacarter y ademas tu estas mandando mal la cadena (*String), cuando debe ser:

Código:
printf("%s\n",String);
Volver arriba
jose_c27



Registrado: 31 Ago 2007
Mensajes: 10

MensajePublicado: 01/09/2007 8:34 am
Título:

Muchas gracias, lo unico que no entendi muy bien fue el proceso de copiar las cadenas...

rir3760 escribió:
Te falta la llamada a malloc para reservar un bloque de memoria con espacio suficiente para almacenar las dos cadenas mas el caracter '\0'.

En C++ seria mas o menos asi:
Código:
#include <cstdio>
#include <cstdlib>

using namespace std;

int main()
{
   char *c1 ="Hola,";
   char *c2 =" mundo";
   
   char *p, *q, *res;
   int num_chars;
   
   // Calcular el numero de caracteres de las cadenas
   for (num_chars = 0, p = c1; *p != '\0'; num_chars++, p++)
      ;
   for (p = c2; *p != '\0'; num_chars++, p++);
      ;
   
   // Reservar el espacio mas un caracter para el '\0'
   res = (char *) malloc(num_chars + 1);
   
   // Copiar las cadenas
   for (p =res, q = c1; (*p = *q) != '\0'; p++, q++)
      ;
   for (q = c2; (*p = *q) != '\0'; p++, q++)
      ;
   
   printf("Resultado == \"%s\"\n", res);
   free(res);
   
   return 0;
}



Un saludo
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 05/09/2007 3:53 pm
Título:

El proceso de copiar las cadenas utiliza tres punteros: uno (res) para apuntar al bloque de memoria donde se almacenaran las cadenas concatenadas, y los otros dos (p y q) para copiar cada uno de los caracteres de las cadenas.

La copia de la primera cadena se realiza en el primer bucle for:
Código:
for (p =res, q = c1; (*p = *q) != '\0'; p++, q++)
      ;

Aqui "p" apunta al primer caracter del bloque mientras que "q" apunta al primer caracter de la cadena a copiar (la cadena "c1"). La copia de cada uno de los caracteres y la verificacion de fin de cadena se realizan en la misma parte, la condicion del bucle:
Código:
(*p = *q) != '\0';

Primero se copia el caracter al cual apunta "q" en la posicion a la que apunta "p" y acto seguido se verifica si este caracter es el indicador de fin de cadena (el '\0'), si esto es asi se termina el bucle y en caso contrario se pasa a procesar el siguiente caracter incrementando ambos punteros.

El proceso de copia de la segunda cadena a copiar (la cadena "c2") es casi identico con la salvedad de que no es necesario darle un valor inicial al puntero "p".

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com