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

Array de cadenas (punteros) solo guarda la última que introduzco

Estas en el tema de Array de cadenas (punteros) solo guarda la última que introduzco en el foro de C/C++ en Foros del Web. Hola a todos, tengo un problema detrás del que llevo días y no doy con la solución. He creado un array de cadenas en C++, ...
  #1 (permalink)  
Antiguo 21/10/2010, 11:49
 
Fecha de Ingreso: octubre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Array de cadenas (punteros) solo guarda la última que introduzco

Hola a todos, tengo un problema detrás del que llevo días y no doy con la solución.
He creado un array de cadenas en C++, con las cadenas como punteros a caracter (no con ancho fijo).
Hago un bucle para que el usuario introduzca cada una de las cadenas, y he probado de varias maneras:
- cin >> array[i];
- cin.getline(array[i],10);
- con una variable intermedia y luego utilizando strcpy.
La única manera que me funciona, cuando muestro todos los valores resulta que ha introducido en todas las posiciones la última cadena que meto.
Por favor, si podéis echarme un cable os lo agradezco un montón.
¡Un saludo y gracias de antemano!
Aquí dejo el código simplificado (funciona, pero mal):
Código:
#include <iostream.h>
#include <string.h>
#include <fstream.h>

const int TAMANO=4;

main()
{
      char *familia[TAMANO];
      char cadena[10];
      for (int i=0; i<TAMANO; i++)
      {
              cout << "Introduce el nombre de la familia de la planta " << i+1 << " ";
              fflush(stdin);
              cin.getline(cadena,10);
              familia[i]=cadena;
              //strcmp(familia[i],cadena);
              //cin.getline(familia[i],10);
              //cin >> familia[i];
              cout << familia[i];
      }
      
      for (int k=0; k<TAMANO; k++)
      {
              cout << familia[k];
      }
      system("pause");
}
  #2 (permalink)  
Antiguo 21/10/2010, 13:16
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Array de cadenas (punteros) solo guarda la última que introduzco

El problema es que estás guardando "cadena" cada vez. getline irá escribiendo a cada posición, pero de la forma en la que estás asignando, en cada puntero del vector quedará copiado el puntero a la primera posición de "cadena".

Para que funcione, deberías hacer algo como esto luego del getline
Código C++:
Ver original
  1. familia[i] = new char[strlen(cadena)+1]
  2. strcpy(familia[i], cadena);
Es decir, copiar la cadena explícitamente a la posición correspondiente en familia.

¡No olvides hacer el delete[] al terminar!


Saludos.
  #3 (permalink)  
Antiguo 23/10/2010, 09:31
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Array de cadenas (punteros) solo guarda la última que introduzco

Recuerda que al usar punteros es necesario reservar espacio de memoria para lo que sea que vayas a escribir en ellos, por lo que por cada puntero que tienes debes hacer lo siguiente

Código c:
Ver original
  1. familia[i] = malloc((strlen(cadena)+1) * sizeof(char));

y ya despues puedes usar el strcpy para copiar el contenido de cadena en familia[i], por cierto no se si con cin.geline ya no es necesario borrar el contenido de cadena antes de leerla, pero por si las dudas podrias utilizar bzero para inicializar tu cadena en 0's antes de asignarle un valor.

Saludos++
  #4 (permalink)  
Antiguo 27/10/2010, 10:19
 
Fecha de Ingreso: octubre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Array de cadenas (punteros) solo guarda la última que introduzco

Qué fallo, se me había olvidado por completo que tenía que reservar memoria :)

¡Muchísimas gracias por vuestra información, me ha funcionado perfectamente!

¡Un saludo!

Etiquetas: c++, cadenas, 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 14:17.