[ Foro de C ]

Arreglos dinamicos en C

04-Jun-2020 02:20
Invitado (michellcrh)
0 Respuestas

Hola
Estoy realizando este programa de la simulación de una librería pero tengo algunos problemas con la funcion "mostrarLibrosVenta", no logro copiar información de la estructura en el arreglo "arregloVentaLibros"
Lo que tengo que hacer es ir guardando el nombre de los libros vendidos en el arreglo "arregloVentaLibros" según el usuario me lo vaya indicando.
Espero me puedan ayudar Por favor.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
#define LIMITE 50

typedef struct{
char *nombre;
char *autor;
int cantidad;
int precio;
} Libro;
void matricula();
void liberarMemoria(Libro *libros, int numeroLibros);
void guardarLibro(Libro *libros, char *temporal, int numeroLibros);
void mostrarLibros(Libro *libros, int numeroLibros);
void mostrarLibrosVenta(Libro *libros, int numeroLibros);

int main(){
   int opc, numeroLibros = 0;
Libro *libros = NULL;
char temporal[SIZE];
FILE *fichero = fopen("libros.txt", "r");

while(fgets(temporal, SIZE, fichero)) {
numeroLibros++;
libros = (Libro*)realloc(libros, numeroLibros * sizeof(Libro));
guardarLibro(libros, temporal, numeroLibros);
}
fclose(fichero);
matricula();
do{
   printf("\t\t\t\tLIBRERIA FI\n");
   printf("1. LEER INVENTARIO INICIAL\n");
   printf("2. MOSTRAR INVENTARIO DE EXISTENCIAS\n");
   printf("3. VENDER LIBROS\n");
   printf("4. INFORME DE VENTAS\n");
   printf("5. SALIR\n\n");
   do{
       printf(" Ingrese el numero con la opcion que desea: ");
       scanf("%d",&opc);
   }while(opc<1 || opc>5);

   if(opc == 1){
          system("cls");
          printf("\n***ARCHIVO LEIDO, PROCESO COMPLETADO***\n\n");
   }
   else if(opc == 2){
            system("cls");
            printf("\t\t\tINVENTARIO DE EXISTENCIAS\n");
            mostrarLibros(libros, numeroLibros);
   }
   else if(opc == 3){
            system("cls");
            mostrarLibrosVenta(libros, numeroLibros);
   }

}while(opc != 5);

liberarMemoria(libros, numeroLibros);
return 0;
}
void liberarMemoria(Libro *libros, int numeroLibros){
for(int i = 0; i < numeroLibros; i++){
free(libros[i].nombre);
free(libros[i].autor);
}
free(libros);
}

void guardarLibro(Libro *libros, char *temporal, int numeroLibros){
char *token = strtok(temporal, ",");
libros[numeroLibros-1].nombre = (char*)malloc((strlen(token)+1) * sizeof(char));
strcpy(libros[numeroLibros-1].nombre, token);

token = strtok(NULL, ",");
libros[numeroLibros-1].autor = (char*)malloc((strlen(token)+1) * sizeof(char));
strcpy(libros[numeroLibros-1].autor, token);

token = strtok(NULL, ",");
libros[numeroLibros-1].cantidad = atoi(token);

token = strtok(NULL, ",");
libros[numeroLibros-1].precio = atoi(token);

}

void mostrarLibros(Libro *libros, int numeroLibros){
for(int i = 0; i < numeroLibros; i++){
printf("***** INFORMACION LIBRO %d *****\n", i+1);
printf("Nombre: %s\n", libros[i].nombre);
printf("Autor: %s\n", libros[i].autor);
printf("Cantidad de libros en existencia: %d\n", libros[i].cantidad);
printf("\n\n");
}
}
void mostrarLibrosVenta(Libro *libros, int numeroLibros){
   int opcion;
   int indiceLibro; // indice del libro a guardar
   char arregloVentaLibros[50][LIMITE]; // limite = 50
   int librosGuardados = 0; // libros guardados en arregloVentaLibros

       for(int i = 0; i < numeroLibros; i++){
   printf("***** INFORMACION LIBRO %d *****\n", i+1);
   printf("Nombre: %s\n", libros[i].nombre);
   printf("Precio: $%d\n", libros[i].precio);
   printf("\n\n");
  }
    do{
       do {
           printf(" Ingrese el numero correspondiente al libro que desea: ");
           scanf("%d", &indiceLibro);
       } while(indiceLibro < 1 || indiceLibro > numeroLibros);

       // Ahora no tenemos que recorrer el bucle, accedemos directamente al indice:
       // Para copiar cadenas, usa strncpy:
       strncpy(arregloVentaLibros[librosGuardados], libros[indiceLibro-1],[LIMITE]); // Al segundo le restamos 1 porque pedimos un indice empezado en 1 pero los arrays en C empiezan en 0.
       arregloVentaLibros[librosGuardados][LIMITE-1] = '\0'; // Para curarme en salud y asegurarme que la cadena tiene un caracter de fin de cadena
       librosGuardados++;
       //char *strncpy(char *restrict s1, const char *restrict s2, size_t n);

       // Si no hemos llegado al limite, le dejamos al usuario elegir:
       if(librosGuardados < 50){
           // Otro bucle para que la opcion sea 1 o 2:
           do {
               printf("Desea guardar otro libro? (1 = Si / 2 = No): ");
               scanf("%d", &opcion);
           } while(opcion != 1 && opcion != 2);
       }
   } while(librosGuardados < 50 && opcion == 1);

   // Aqui ya puedes mostrar los nombres guardados usando como limite <personasGuardadas>:
   printf("Los libros vendidos son:\n");
   for(int i = 0; i < librosGuardados; i++){
       printf("%s\n", arregloVentaLibros[i]);
   }

}




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)