Imprimir array de Structs

Iniciado por dennis094, 16 Enero 2014, 00:41 AM

0 Miembros y 1 Visitante están viendo este tema.

dennis094

Buenas,
tengo una ejercicio sobre structs bastante simple, solo tengo que leer unas cuantas personas por teclado (nombre apellidos y sexo) e imprimirlos... la cosa es que no lo consigo xD

La cosa es que yo quiero indicar cuantas personas quiero dar de alta, introducir sus datos, e ir guardando cada persona con sus atributos en un array de personas, para mas adelante imprimir ese array.

os dejo el codigo: /*
============================================================================
Name        : Arrays1.c
Author      :
Version     :
Copyright   : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/

#include <stdio.h>
#include <stdlib.h>

#define MAX 30

typedef char cadena[50];
typedef char texto[200];

typedef struct {
cadena nombre;
cadena apellido;
char sexo;
}persona;

persona p;
typedef persona personas[MAX]; // array de personas
personas arrayPersonas; // inicializamos el array de personas

void leer(int num){
int i;

for(i=0;i<num;i++){ // dara de alta tantas personas como yo le indique por teclado
printf("Nombre:");
gets(p.nombre);
fflush(stdin); // limpiamos el buffer de entrada
printf("\nApellido:");
gets(p.apellido);
fflush(stdin);
printf("\nSexo:");
scanf("%c", &p.sexo);
fflush(stdin);

persona p ={ p.nombre, p.apellido, p.sexo };
arrayPersonas[i] = p;
}

}

void imprime(int num){
int i;
for(i=0;i<num;i++){
printf("%s, %s - sexo %c",arrayPersonas[i].apellido, arrayPersonas[i].nombre, arrayPersonas[i].sexo);
}
}

int main(void) {
int numP;

printf("Numero de personas que desea dar de alta:");
scanf("%d", &numP);
fflush(stdin);

leer(numP);
imprime(numP);

return 0;
}


El fallo esta claramente en que la persona "p" que doy de alta en la funcion "leer", no se guarda correctamente en el array de personas, quiza es que esa no sea la sintaxis correcta para agregar a la persona que he creado a mi array.

Un saludo, espero vuestra ayuda.

rir3760

Lo primero que debes hacer es evitar el uso de gets y fflush(stdin), las razones de ello se explican en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

El problema se debe (como indicas) a que la sintaxis que utilizas en la función "leer" no es la correcta. En esa función no necesitas de una variable auxiliar ya que puedes utilizar directamente el elemento del array "arrayPersonas".

Si incluimos el encabezado <string.h> y modificamos la función:
#include <string.h>

/* ... */

void leer(int num)
{
   int i;
   int ch;
   char *p;
   
   for (i = 0; i < num; i++){
      puts("Nombre:");
      fgets(arrayPersonas[i].nombre, 50, stdin);
      /* Eliminamos (si existe) el avance de linea del nombre */
      if ((p = strchr(arrayPersonas[i].nombre, '\n')) != NULL)
         *p = '\0';
     
      puts("Apellido:");
      fgets(arrayPersonas[i].apellido, 50, stdin);
      /* Eliminamos (si existe) el avance de linea del apellido */
      if ((p = strchr(arrayPersonas[i].apellido, '\n')) != NULL)
         *p = '\0';
     
      puts("Sexo:");
      scanf("%c", &arrayPersonas[i].sexo);
     
      /* Descartamos el resto de la linea */
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
   }
}

El programa funcionara correctamente. Por ultimo hay que eliminar la variable "p":
persona p;
Ya que no se utiliza en el programa.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

dennis094

Joer, que sencillo, simplemente guardar la entrada de teclado en el array directamente, nose porque me empeñe en guardarlo dentro de una persona, y luego intentar agregar a esa persona al array... supongo que estaria cansado ya y no lo veia jajajaja

Por curiosidad, ¿en c hay alguna funcion como en java con la funcion "puts" que te permitia agregar un objeto (en este caso un struct) al array?
Muchas gracias ;)

rir3760

Cita de: dennis094 en 16 Enero 2014, 23:22 PM¿en c hay alguna funcion como en java con la funcion "puts" que te permitia agregar un objeto (en este caso un struct) al array?
No.

En C la operación debe hacerse manualmente, lo usual es tener un array del tamaño "apropiado" y un contador del numero de elementos utilizados. Para agregar el elemento simplemente se asigna y se incrementa el contador, por ejemplo:
struct cadena {
   char *ch;
   size_t num_chars;
};

/* ... */

struct cadena linea[100];
size_t num_lineas = 0;
struct cadena aux;

/* ... */

/* Agregamos manualmente una linea (almacenada en el auxiliar) */
linea[num_lineas] = aux;
num_lineas++;


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language