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

validar un miembro de una estructura en c

Estas en el tema de validar un miembro de una estructura en c en el foro de C/C++ en Foros del Web. Hola, Estoy intentando validar un char de 100 elementos y esta dentro de la estructura, @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h> #include <stdlib.h> ...
  #1 (permalink)  
Antiguo 05/04/2020, 23:39
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 14 años, 3 meses
Puntos: 9
validar un miembro de una estructura en c

Hola,

Estoy intentando validar un char de 100 elementos y esta dentro de la estructura,

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_LIBROS 10
  5.  
  6. struct libro{
  7.     int codigo;
  8.     char titulo[100];
  9.     int anio;
  10. };
  11.  
  12. struct libreria{
  13.     int numero;
  14.     char nombre[100];
  15.     char telefono[30];
  16.     struct libro reg_libro[MAX_LIBROS];
  17. };
  18.  
  19. void mostrarResultados(struct libreria l[]);
  20.  
  21. int main() {
  22.    
  23.  
  24.    
  25.     struct libreria listadoL[2];
  26.    
  27.     listadoL[0].numero = 200;
  28.     strcpy(listadoL[0].nombre, "Antartica");
  29.     strcpy(listadoL[0].telefono, "56973567762");
  30.    
  31.     //Libro 1
  32.    
  33.     listadoL[0].reg_libro[0].codigo = rand();
  34.     strcpy(listadoL[0].reg_libro[0].titulo, "Harry Potter, La Piedra Filosofal");
  35.     listadoL[0].reg_libro[0].anio = 2001;
  36.    
  37.     //Libro 2
  38.    
  39.     listadoL[0].reg_libro[1].codigo = rand();
  40.     strcpy(listadoL[0].reg_libro[1].titulo, "Harry Potter, La camara secreta");
  41.     listadoL[0].reg_libro[1].anio = 2001;
  42.    
  43.    
  44.    
  45.     puts("=== MOSTRAR RESULTADOS ===");
  46.     mostrarResultados(listadoL);
  47.    
  48.     return (EXIT_SUCCESS);
  49. }
  50.  
  51. void mostrarResultados(struct libreria l[]){
  52.    
  53.     for(int x=0; x<2; x++){
  54.         printf("\nlargo: %d\n", strlen(l[x].nombre));
  55.         if(l[x].nombre != NULL){
  56.             printf("\nLibreria: %s", l[x].nombre);
  57.             printf("\nTelefono: %s\n", l[x].telefono);
  58.  
  59.             for(int i=0; i<2; i++){
  60.                 printf("\nCodigo Libro: %d", l[x].reg_libro[i].codigo);
  61.                 printf("\nTitulo: %s", l[x].reg_libro[i].titulo);
  62.  
  63.                 printf("\n");
  64.             }
  65.         }
  66.  
  67.     }
  68. }

pero me dice que tiene 2 de largo y no deberia tener nada nose como validarlo ya que no viene como nulo o vacio o undefined o cualquier cosa que me diga que no tiene nada.

Aqui esta lo que devuelve
Código C:
Ver original
  1. === MOSTRAR RESULTADOS ===
  2.  
  3. largo: 9
  4.  
  5. Libreria: Antartica
  6. Telefono: 56973567762
  7.  
  8. Codigo Libro: 1804289383
  9. Titulo: Harry Potter, La Piedra Filosofal
  10.  
  11. Codigo Libro: 846930886
  12. Titulo: Harry Potter, La camara secreta
  13.  
  14. largo: 2
  15.  
  16. Libreria: &#65533;
  17. Telefono: &#65533;h���
  18.  
  19. Codigo Libro: 974762479
  20. Titulo: &#65533;
  21.  
  22. Codigo Libro: 32764
  23. Titulo: &#65533;��9�
  24.  
  25. RUN FINISHED; exit value 0; real time: 0ms; user: 0ms; system: 0ms

por el momento seguiré intentando, ojala me ayuden
y gracias
  #2 (permalink)  
Antiguo 06/04/2020, 07:41
 
Fecha de Ingreso: abril-2011
Mensajes: 170
Antigüedad: 13 años, 7 meses
Puntos: 68
Respuesta: validar un miembro de una estructura en c

En C, las variables locales que no inicialices a un valor determinado, tendrán valores indefinidos.

Indefinidos no significa ni vacío ni undefined ni NULL como tal, significa que puede ser cualquier cosa que se encuentre en la memoria de tu computador en ese momento. De ahí que obtengas resultados tan extraños en la segunda iteración.

La pregunta es, ¿por qué declaras struct libreria listadoL[2] cuando solamente utilizas un único struct librería? No es mejor hacer algo así:

Código C:
Ver original
  1. #define NUM_LIBRERIAS 1

Código C:
Ver original
  1. struct libreria listadoL[NUM_LIBRERIAS];

Código C:
Ver original
  1. void mostrarResultados(struct libreria l[]){
  2.    
  3.     for(int x = 0; x < NUM_LIBRERIAS; x++){
  4.         printf("\nlargo: %d\n", strlen(l[x].nombre));
  5.         printf("\nLibreria: %s", l[x].nombre);
  6.         printf("\nTelefono: %s\n", l[x].telefono);
  7.  
  8.         for(int i=0; i<2; i++){
  9.             printf("\nCodigo Libro: %d", l[x].reg_libro[i].codigo);
  10.             printf("\nTitulo: %s", l[x].reg_libro[i].titulo);
  11.  
  12.             printf("\n");
  13.         }
  14.  
  15.     }
  16. }

Última edición por prueba230683; 06/04/2020 a las 07:47
  #3 (permalink)  
Antiguo 06/04/2020, 07:50
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: validar un miembro de una estructura en c

lo hice a propósito, para ver como puedo validar algo así, y como puedes ver todo esta fijo, 2 arreglos de estructuras, 10 libros puedo guardar por estructura y cosas asi, todo fijo, estoy viendo que puedo y no puedo hacer.

es que hice esto en struct

int MAX = 100;

struct libreria listaLibrerias[MAX];

y no funciono, me funciona solo con #define MAX 100
  #4 (permalink)  
Antiguo 06/04/2020, 08:50
 
Fecha de Ingreso: abril-2011
Mensajes: 170
Antigüedad: 13 años, 7 meses
Puntos: 68
Respuesta: validar un miembro de una estructura en c

Cita:
lo hice a propósito, para ver como puedo validar algo así
No creo que se pueda hacer eso en C.

A diferencia de otros lenguajes (por ejemplo JavaScript) en los cuales cuando algo no está definido aparece como "undefined", C directamente te arroja contenido aleatorio de la memoria, lo cual es difícilmente validable....

Cita:
int MAX = 100;

struct libreria listaLibrerias[MAX];

y no funciono, me funciona solo con #define MAX 100
Te funciona con macros (#define MAX 100) porque los macros son reemplazados por el preprocesador de C, antes de la compilación del programa.

Última edición por prueba230683; 06/04/2020 a las 08:59
  #5 (permalink)  
Antiguo 07/04/2020, 20:40
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: validar un miembro de una estructura en c

tengo claro que no puedo validar un miembro porque no viene nulo y tampoco indefinido eso esta claro, pero necesito validar ejemplo tengo un arreglo de estructuras de 100 y tengo cargado ese arreglo de estructuras hasta indice 20, me sobran 80, si quiero recorrerlos quiero recorrer solo los que tiene datos.

porque yo para asegurarme creo un arreglo de 1.000.000 si quiero, pero no necesariamente voy a tener cargado hasta un millón.

pregunta:
¿Que solución se puede hacer para algo así?
¿Es posible crear dinamicamente o incrementar el arreglo de estructuras dinamicamente?
  #6 (permalink)  
Antiguo 08/04/2020, 07:38
 
Fecha de Ingreso: abril-2011
Mensajes: 170
Antigüedad: 13 años, 7 meses
Puntos: 68
Respuesta: validar un miembro de una estructura en c

Cita:
porque yo para asegurarme creo un arreglo de 1.000.000 si quiero, pero no necesariamente voy a tener cargado hasta un millón.
Para eso está la reserva dinámica de memoria en C. Lee acerca de las funciones malloc(), calloc(), realloc() y free().

Malloc te permite reservar un bloque de memoria de X bytes.
Calloc es lo mismo que malloc solo que te inicializa a 0 los valores (en vez de dejar valores aleatorios).
Free libera la memoria asignada mediante malloc.
Realloc es para asignar más memoria o reducirla después de haber usado malloc.

Por ejemplo, con este código puedes crear un array de 3 enteros:
Código C:
Ver original
  1. int* ptr; // declaramos puntero hacia entero
  2.  
  3. ptr = (int*)malloc(sizeof(int) * 3); // asignamos memoria para almacenar 3 enteros
  4.  
  5. ptr[0] = 123;
  6. ptr[1] = 456;
  7. ptr[2] = 789;
  8.  
  9. // ya no nos queda más memoria

Si más tarde ves que necesitas almacenar más de 3 enteros, puedes usar realloc:

Código C:
Ver original
  1. ptr = (int*)realloc(ptr, sizeof(int) * 5); // ahora podemos almacenar hasta 5 enteros sin perder la información que teníamos anteriormente
  2.  
  3. printf("%d %d %d", ptr[0], ptr[1], ptr[2]); // 123 456 789
  4.  
  5. // añadimos más elementos
  6.  
  7. ptr[3] = 1337;
  8. ptr[4] = 8888;
  9.  
  10. // ya no podemos añadir más

Así sucesivamente...

Docs:
https://es.cppreference.com/w/c/memory/malloc
https://es.cppreference.com/w/c/memory/realloc

Última edición por prueba230683; 08/04/2020 a las 07:49

Etiquetas: estructura
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 11:19.