| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
jose_c27
Registrado: 31 Ago 2007 Mensajes: 10
| Publicado: 01/09/2007 6:22 am | | | Título: Concatenar Cadenas Punteros |
| 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 |
| | Volver arriba | |  | Keeper
Registrado: 13 Abr 2006 Mensajes: 17
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 01/09/2007 8:32 am | | | Título: Re: re |
| Perdona tenias razon my bad 
| 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |