[C] Problemas para leer datos

Iniciado por cbug, 16 Junio 2010, 17:59 PM

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

cbug

Tengo el siguiente problema:

cbug@debian:~$ ./a.out
Ingrese cantidad de personas>
1   
---INGRESO DE PACIENTES---
Ingrese nombre>
Ingrese fecha visita
|


Resulta que no puedo ingresar el nombre.

#include <stdio.h>

/* Programa para manejo de una lista de pacientes */
/* Se mostraran los pacientes con una fecha determinada de visita */

#define MAX 30

typedef struct Paciente{
char nombre[20];
char direccion[20];
char fechanac[13];
char sexo;
char fechavisita[13];
char problema[100];
}PACIENTE;

void Ingreso_Lista(PACIENTE P[], int N);
void Ingreso_Paciente(PACIENTE *P);
void Muestra(PACIENTE P[], int N, char F[]);

int main(){
int cantidad;
PACIENTE MiLista[MAX];
char fecha[13];
puts("Ingrese cantidad de personas>");
scanf("%d", &cantidad);
Ingreso_Lista(MiLista, cantidad);
puts("Ingrese fecha a buscar>");
fgets(fecha, sizeof(char)*13, stdin);
Muestra(MiLista, cantidad, fecha);
}

void Ingreso_Paciente(PACIENTE *P){
puts("Ingrese nombre>");
fgets(P->nombre,sizeof(char)*20,stdin);
puts("Ingrese fecha visita");
fgets(P->fechavisita,sizeof(char)*13,stdin);
}

void Ingreso_Lista(PACIENTE P[], int N){
int i;
puts("---INGRESO DE PACIENTES---");
fflush(stdout);
for(i = 0; i < N; i++)
Ingreso_Paciente(&P[i]);
puts("---FINALIZADO---");
}

void Muestra(PACIENTE P[], int N, char F[]){
int i;
for(i = 0; i < N; i++)
if(*P[i].fechavisita == *F)
puts(P[i].nombre);
}


leogtz

Tienes que limpiar el buffer.

Déjalo así:
puts("Ingrese cantidad de personas>");
scanf("%d", &cantidad);
while(getchar() != '\n');
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

cbug

Muchas gracias... Una pregunta, sería correcto utilizar:

setbuf(stdin, NULL);
:huh:

Horricreu

Léete esto, es una chincheta:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Saludos :P

cbug

 :-\ No comprendo tu respuesta... O tu link... O no encuentro la respuesta a setbuf.

leogtz

He leído que usar setbuf(stdin, NULL), puede resultar en un comportamiento no definido.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Horricreu

#6
Cita de: cbug en 16 Junio 2010, 18:51 PM
:-\ No comprendo tu respuesta... O tu link... O no encuentro la respuesta a setbuf.

Supongo que lo dices por lo de limpiar el buffer. En esta chincheta hay la forma correcta de hacerlo, no sé si sale para ficheros.

En cuando a setbuf(), me parece que está mal: el primer parámetro debe de ser un puntero a fichero o en su defecto streams como stdout o stderr para limpiarlo (leído de acá).

Saludos :P

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Littlehorse

cbug, efectivamente no esta la referencia a setbuf. No la he agregado porque es una mala costumbre bastante reciente en este foro, pero la agregare en cualquier momento. Igualmente horricreu te paso el link para que tomes la idea que si no dejas basura en el buffer, no necesitas limpiarlo.

En cuanto a lo de setbuf, es incorrecto. Utilizar setbuf de esa forma acarrea comportamiento indefinido.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

cbug