• Lunes 29 de Abril de 2024, 01:13

Autor Tema:  Copiado, capturar, cadenas dinamicas.  (Leído 1937 veces)

portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Copiado, capturar, cadenas dinamicas.
« en: Miércoles 5 de Septiembre de 2012, 08:54 »
0
Saludos a todos, ahora me encuentro en un lio, tratando de hacer de forma dinamica el uso de cadenas. Ya que dada 2 o mas cadenas desde la linea de comandos, ocupo hacer cosas como copiar, concatenar o volver a capturar la cadena dentro del programa.

La forma de introducir la cadena despues de la compilacion es
C:\>programa.exe cadena1 cadena2
ejemplo que he estado testeando
C:\>programa.exe ana fantasia

El codigo es el siguiente:
Código: C
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. void copia(char *, char*);
  7. char tamano(char *);
  8. void capturar(char *);
  9.  
  10. int main(int argc, char **argv) {
  11.     /*Primer elemento es el origne, el segundo el destino*/
  12.     copia(argv[2],argv[1]);
  13.     printf("\nOrigen : %s",argv[2]);
  14.     printf("\nDestino : %s",argv[1]);
  15.     capturar(argv[1]);
  16.     printf("\nOrigen : %s",argv[2]);
  17.     printf("\nDestino capturado : %s",argv[1]);
  18.     return 0;
  19. }
  20.  
  21. void capturar(char *cadena){
  22.      char *tmp;
  23.      printf("\nInserte la cadena : ");
  24.      gets(cadena);
  25.      fflush(stdin);
  26.      printf("%s",cadena);
  27. }
  28.  
  29. void copia(char *origen, char *destino) {
  30.      int i=0;
  31.      while(origen[i]){
  32.          destino[i]=origen[i];
  33.          i++;
  34.      }
  35.      if(tamano(destino)>tamano(origen))
  36.          while(destino[i]) {
  37.              destino[i]=0;
  38.              i++;
  39.      }
  40. }
  41.  
  42. char tamano(char *palabra) {
  43.      int i=0;
  44.      while(palabra[i])
  45.          i++;
  46.      return i;
  47. }

Primero presento problemas al cocatenar las cadenas, por lo que me puse a revisar las direcciones en que se estan guardando, al parecer estan consecuivas, bueno deje la funcion de concatenar pendiente. Pero por ahora ocupo de su ayuda para la copia y capturacion nueva.

Es decir, si yo puse "C:\>programa ana fantasia" el programa debe ser capaz de pasar la palabra1 (ana) copiarla a la palabra2(fantasia). Imprimiendo
p1: ana
p2: ana
Pero tambien debe podre pasar al palabra2(fantasia) a la palabra1(ana). Imprimiendo
p1: fantasia
p2: fantasia
Este paso no sucede asi. Por el manejo de memoria que no encuentro como solucionar.

Despues de haber hecho una copia de cadenas, independientemente si p1 paso a p2 o p2 paso a p1, debo tener la opcion de capturar nuevamente la cadena ya dentro del programa, ejemplo.
Desde la linea de comandos se mando
C:\>programa ana fantasia
p1: ana
p2: fantasia
Captura nueva dentro del programa: "el perico verde", imprime
p1: el perico verde
p2: fantasia

He tratado de usar realloc, malloc, y calloc, pero no me da algun resultado, por favor alguien me podria hechar la mano con estas 2 funciones.

portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re:Copiado, capturar, cadenas dinamicas.
« Respuesta #1 en: Jueves 6 de Septiembre de 2012, 02:10 »
0
Me parece que con el siguiente codigo logre conseguir lo buscado, cualquier error que encuentren por favor avisarme.

Código: C
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. char *copia(char *);
  7. char tamano(char *);
  8. char *capturar();
  9.  
  10. int main(int argc, char **argv) {
  11.     char *p1,*p2;
  12.     p1 = (char *)calloc(tamano(argv[1]),sizeof(char));
  13.     p2 = (char *)calloc(tamano(argv[2]),sizeof(char));
  14.     p1=copia(argv[1]);
  15.     printf("\n");
  16.     p2=copia(argv[2]);
  17.     /*Primer elemento es el origne, el segundo el destino*/
  18.     printf("\n");
  19.     p2=copia(p1);
  20.     printf("\nOrigen : %s",p1);
  21.     printf("\nDestino : %s",p2);
  22.     p2=capturar();
  23.     printf("\nOrigen : %s",argv[2]);
  24.     printf("\nDestino capturado : %s",argv[1]);
  25.     printf("\nDestino : %s",p2);
  26.     printf("\nOrigen : %s",p1);
  27.     return 0;
  28. }
  29.  
  30. char *capturar(){
  31.      char car;
  32.      char *cadena=NULL;
  33.      int i=0,num=0;
  34.      printf("\nIntroduce la cadena: ");
  35.      while ((car=getchar()) != '\n') /*Finaliza con un enter*/
  36.      {  
  37.         if(i>=num)
  38.         {  
  39.            num+=10;
  40.            cadena=(char *)realloc((char *)cadena,(num)*sizeof(char));
  41.            if (cadena == NULL) exit(-1);
  42.         }
  43.         cadena[i++] = car;
  44.      }
  45.      cadena[i++] = '\0';
  46.      return cadena;
  47. }
  48.  
  49. char *copia(char *origen) {
  50.      char *tmp;
  51.      int i=0;
  52.      tmp = (char *)calloc(tamano(origen),sizeof(char));
  53.      while(origen[i]) {
  54.          tmp[i] = origen[i];
  55.          i++;
  56.      }
  57.      tmp[i]='\0';
  58.      return tmp;
  59. }
  60.  
  61. char tamano(char *palabra) {
  62.      int i=0;
  63.      while(palabra[i])
  64.          i++;
  65.      return i;
  66. }