1

tengo un problema: Soy alguien muy novato aun en C++, mi problema viene con el struct, cuando quiero agregar un nombre por poner un ejemplo, en teoria se agrega a la estructura, pero al quererlo mostrar no sale nada. Codigo:

#include <iostream>
#include <string>

using namespace std;

struct Libros
{
    string nombre;
}libro[100];

int cont=-1;

void Insertar()
{
    cont++;
    cout<<"Nombre: ";
    getline(cin,libro[cont].nombre);
    cin.ignore(1000,'\n');
}

void MostrarTodo()
{
    cout<<"LIBROS DISPONIBLES: "<<endl;
    for(int i=0; i<cont; i++)
        cout<<libro[i].nombre;
}

Mi sospecha es de que esta parte del codigo es la del problema, pero no se cual sea el problema.

2 Answers2

3

Mi sospecha es de que esta parte del código es la del problema

Mi sospecha es que no muestras nada porque no recopilas nada. No veo en el código que has compartido la parte en que rellenas la formación1 de libros.

No se si mi sospecha es cierta (creo que es Eferion quien está en lo cierto), porque tu código es parcial, pero aún con el código que has mostrado hay mucho espacio para la mejora. Tu código no sigue la estructura de lo que se podría considerar programación contemporánea en C++.

  1. No uses formaciones1 a no ser que sea estrictamente necesario, que en tu caso no lo es. Reservando memoria para 100 libros te arriesgas a quedarte corto de espacio (¿qué pasa si quieres más de 100 libros?) o pasarte de largo (malgastas mucha memoria si sólo vas a guardar unas pocas decenas de libros). En su lugar usa un contenedor de datos, elije el que más se ajuste a tus necesidades.
  2. La estructura Libros tiene el nombre en plural pero contiene un sólo elemento, la formación1 libro tiene el nombre en singular pero contiene 100 elementos; eso es tremendamente confuso, cambia tu nomenclatura para que sea más coherente.
  3. Intenta favorecer el uso de '\n' frente al uso de std::endl, suele tener un rendimiento mayor la primera opción (lee este hilo para saber más del tema).

Con las sugerencias anteriores, tu código podría parecerse a esto:

struct Libro
{
    std::string nombre;
};

using lista_libros = std::list<Libro>;

void Insertar(lista_libros &lista)
{
    Libro nuevo_libro;

    std::cout<<"Nombre: ";
    std::getline(std::cin, nuevo_libro.nombre);
    lista.push_back(nuevo_libro);
}

void Mostrar(lista_libros &lista)
{
    std::cout << "LIBROS DISPONIBLES:\n";

    for (const auto &libro : lista)
        std::cout << libro.nombre << '\n';
}

Que puede usarse así:

int main()
{
    lista_libros cifi, misterio;
    Insertar(cifi);
    Insertar(cifi);
    Insertar(misterio);
    Insertar(misterio);

    Mostrar(cifi);
    Mostrar(misterio);

    return 0;
}

Puedes ver el código funcionando en Wandbox.


  1. También conocida como arreglo o en inglés array.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
2

Tu problema es que estás usando cont de forma incorrecta.

Se supone que cont debe indicar cuántos elementos hay en la lista, mientras que tu lo usas para indicar el índice del último elemento.

Un par de cambios y el código fucionará como esperas.

Lo primero es que cont debe empezar en 0 y la razón es que inicialmente hay 0 elementos en tu lista:

int cont=-0;

Lo siguiente a tocar es el método Insertar. Ahora cont no debe incrementarse hasta que no hayamos añadido un elemento a la lista, es decir, después de haberlo añadido:

void Insertar()
{
    cout<<"Nombre: ";
    getline(cin,libro[cont].nombre);
    cont++;
}

Nota también que he eliminado la llamada a ignore. Si solo usas getline, el método ignore no es demasiado util (ya has leido toda la línea con getline). En cambio si mezclas cin y getline entonces la llamada a ignore debería estar antes de llamar a getline y esto es así porque cin no elimina el salto de línea previo.

Finalmente, falta actualizar MostrarTodo. No añades ningún separador entre los diferentes nombres. Yo he elegido un salto de línea:

void MostrarTodo()
{
    cout<<"LIBROS DISPONIBLES: "<<endl;
    for(int i=0; i<cont; i++)
        cout<<libro[i].nombre << '\n';
}
eferion
  • 49,291
  • 5
  • 30
  • 72