Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema al inicializar cadenas con punteros

Estas en el tema de Problema al inicializar cadenas con punteros en el foro de C/C++ en Foros del Web. Hola. Estoy intentando inicializar una cadena mediante punteros, para reservar el espacio exacto. Tengo esto, pero al comprobar si copia lo que pongo, me salen ...
  #1 (permalink)  
Antiguo 22/04/2012, 10:41
 
Fecha de Ingreso: enero-2012
Mensajes: 68
Antigüedad: 12 años, 10 meses
Puntos: 0
Problema al inicializar cadenas con punteros

Hola.

Estoy intentando inicializar una cadena mediante punteros, para reservar el espacio exacto.

Tengo esto, pero al comprobar si copia lo que pongo, me salen solo caracteres raros...

Código C:
Ver original
  1. void inicializarCadenas(char *cad1, char *cad2, int n)
  2. {
  3.      char c;
  4.      int j=0;
  5.      
  6.      cad1 = (char*)malloc(sizeof(char));
  7.      
  8.      while((c = getchar()) != '\n')
  9.      {
  10.         cad1[j] = c;
  11.         j++;
  12.         cad1 = (char*)realloc(cad1, (j+1) * sizeof(char));
  13.      }
  14.        
  15.      cad1[j] = '\0';
  16.      
  17. }
  18. int main()
  19. {
  20.     char *cadena1, *cadena2;
  21.     int n,i;
  22.    
  23.     inicializarCadenas(cadena1, cadena2, n);
  24.    
  25.     puts(cadena1);
  26.    
  27.     system("pause");
  28.     return 0;
  29. }

Muchas gracias!

Saludos.
  #2 (permalink)  
Antiguo 22/04/2012, 11:39
 
Fecha de Ingreso: enero-2012
Mensajes: 68
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Problema al inicializar cadenas con punteros

Siento el doble post.

He intentado esto:

Código C:
Ver original
  1. char* inicializarCadenas(char *cad)
  2. {
  3.      char c;
  4.      int j=0;
  5.      
  6.      cad = (char*)malloc(sizeof(char));
  7.      
  8.      while((c = getchar()) != '\n')
  9.      {
  10.         cad[j] = c;
  11.         j++;
  12.         cad = (char*)realloc(cad, (j+1) * sizeof(char));
  13.      }
  14.        
  15.      cad[j] = '\0';
  16.      
  17.      return cad;
  18. }
  19. int main()
  20. {
  21.     char *cadena1, *cadena2;
  22.     int n,i;
  23.    
  24.     cadena1 = inicializarCadenas(cadena1);
  25.     puts(cadena1);
  26.    
  27.    
  28.    
  29.     system("pause");
  30.     return 0;
  31. }

Y ahora sí sale.

¿Por qué es necesario devolver la cadena? Creía que si no devolvía nada (void) me hacía los cambios de todos los parámetros automáticamente...

Gracias.
  #3 (permalink)  
Antiguo 22/04/2012, 11:47
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Problema al inicializar cadenas con punteros

Pues es muy sencillo, dentro de la función inicializarCadenas, estás asignando al puntero cad nuevas direcciones de memoria, pero ese cambio de dirección no se ve fuera de la función.

Para que pudieses hacerlo así tendrías que pasarle un doble puntero:

Código C:
Ver original
  1. void inicializarCadenas(char **cad)
  2. {
  3.      char c;
  4.      int j=0;
  5.      
  6.      *cad = (char*)malloc(sizeof(char));
  7.      
  8.      while((c = getchar()) != '\n')
  9.      {
  10.         (*cad)[j] = c;
  11.         j++;
  12.         *cad = (char*)realloc(*cad, (j+1) * sizeof(char));
  13.      }
  14.        
  15.      (*cad)[j] = '\0';
  16. }
  17.  
  18. int main()
  19. {
  20.     char *cadena1, *cadena2;
  21.     int n,i;
  22.    
  23.     inicializarCadenas(&cadena1);
  24.     puts(cadena1);
  25.    
  26.    
  27.    
  28.     system("pause");
  29.     return 0;
  30. }
  #4 (permalink)  
Antiguo 22/04/2012, 11:54
 
Fecha de Ingreso: enero-2012
Mensajes: 68
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Problema al inicializar cadenas con punteros

Muchísimas gracias. Ya he entendido por qué no se hacían los cambios.
Saludos.

Etiquetas: cadenas, inicializar, int, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:34.