1

Hice este código al momento de pedir los datos me sale bien pero después cuando quiero mostrar los datos que pedi la impresion sale mal, me podrian decir por favor que tengo que hacer para que salga bien la impresion por favor.Dejo una imagen para que vean la impresion final, solo el nombre del ultimo libro nada mas me muestra .Por favor necesito de su ayuda para resolver esto y de antemano graciasintroducir la descripción de la imagen aquí

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

void main(){
    int lib;
    char libro[50];
    cout<<"Cantidad de libros: ";
    cin>>lib;
    for(int i=0;i<lib;i++){
        cout<<"Nombre del libro "<<i+1<<" :";
        fflush(stdin);
        gets(libro);
        cout<<endl;
    }
    for(int i=0;i<lib;i++){
        cout<<"Nombre del libro "<<i+1<<" : "<<libro<<endl;
    }
    system("pause");
}
  • `fflush(stdin)` es una [comportamiendo indefinido](https://es.wikipedia.org/wiki/Comportamiento_indefinido). Creo que debes usar `while(getchar() != '\n')` o algo. – iBug Sep 03 '18 at 01:16
  • Para mi lo mejor sería crear un estructura de nombre libros con las propiedade de nombres, luego ya definido tu estructura creas un array de estructuras. – Silvio Colman Sep 03 '18 at 01:43

2 Answers2

3

Tal y como ha dicho iBug quieres guardar dos libros, pero sólo tienes espacio para uno.


Si quieres más libros, necesitarás más espacio para libros, la solución propuesta por iBug es correcta y funcional (limitada un máximo de 10 libros), pero yo te aconsejo una solución más acorde con el lenguaje, en primer lugar señalaré tus fallos más evidentes:

  • Las cabeceras <stdlib.h> y <stdio.h> son de C, no de C++, si realmente necesitas usarlas (que no las necesitas) debes usar los equivalentes de C++: <cstdlib> y <cstdio>. Consulta esta pregunta para saber por qué.
  • La manera de trabajar con cadenas de caracteres en C++ es usando objetos de tipo std::string (accesibles tras incluir la cabecera <string>) no con formaciones1 de caracteres.
  • La manera de trabajar con colecciones de tamaño arbitrario en C++ es usando contenedores de objetos, por ejemplo std::list (accesibles tras incluir la cabecera <list>) no con formaciones1.
  • No se aconseja el uso de using namespace std; en el ámbito global, si fuese necesario usarlo (no suele serlo) debe usarse en el ámbito más pequeño posible. Consulta este hilo para saber por qué.
  • No suele ser necesario usar std::endl, es más eficiente usar un salto de línea explícito \n, consulta este hilo para saber por qué.
  • La función main, debe devolver un valor. Consulta este hilo para saber por qué.
  • Favorece el pre-incremento frente al post-incremento.

Teniendo en cuenta todas estas correcciones tu código podría quedar así:

#include <iostream>

int main(){
    using lista_libros = std::list<std::string>;

    lista_libros libros;
    int lib;

    std::cout << "Cantidad de libros: ";
    std::cin >> lib;

    for (int i = 0; i < lib; ++i) {
        std::cout << "Nombre del libro " << i + 1 << " :";
        std::string libro;

        std::cin >> libro;
        libros.push_back(libro);
    }

    lib = 0;

    for (const auto &libro : libros) {
        std::cout << "Nombre del libro " << ++lib << " : " << libro << '\n';
    }

    return 0;
}

  1. También conocidas como arreglos o en inglés arrays.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
2

Eres escribiendo libro en el bucle primero de for por cada vez. Creo que debes usar un array de arrays:

char libro[10][50];
//        ^^^^
cout<<"Cantidad de libros: ";
cin>>lib;
for(int i=0;i<lib;i++){
    cout<<"Nombre del libro "<<i+1<<" :";
    fflush(stdin);
    gets(libro[i]);
    cout<<endl;
}
for(int i=0;i<lib;i++){
    cout<<"Nombre del libro "<<i+1<<" : "<<libro[i]<<endl;
}
iBug
  • 123
  • 6