[ Foro de C ]

Estructuras y arreglos dinámicos en C

04-Jun-2020 02:38
Michell Cruz Hernandez
1 Respuestas

Hola
tengo problema con este código, en la funcion "mostrarLibrosVenta()"
Lo que tengo que hacer es guardar el nombre de los libros que el usuario digite, segun el numero correspondiente, en el arreglo "arregloVentaLibros" pero no logro hacerlo,
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 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);
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]);
   }

}


13-Jun-2020 12:53
Invitado (carlos)

hola michell

a primera vista da un error en la funcion strncpy y con razon

el protipo es:  
char* strncpy(char *s1, const char *s2, size_t n);

y tu le mandas:  
strncpy(arregloVentaLibros[librosGuardados], libros[indiceLibro-1],[LIMITE]);

donde a [LIMITE] le sobran los corchetes

y libros[indiceLibro-1] es un array de estructuras "Libro" no un array de char

siendo que el string que quieres copiar ya esta introducido y se supone correcto porque no usar strcpy en vez de strncpy ?

solo me he fijado en le que dice el compilador no se si tienes algun errror mas

suerte con el codigo ;)






(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.)