PDA

Visualizza la versione completa : [C]Non finisce piu' di stampare, fflush vs getchar


ramy89
06-12-2010, 21:32
Salve a tutti,sto scrivendo un programma,per ora incompleto,ma gi trovo dei problemi,in particolare col buffer che si riempie e non so come svuotarlo.
Con la tecnica:


while(getchar()!=10);

Finora ho sempre usato questa tecnica,ma ora vedo che mi ignora le fscanf e parte a stampare caratteri,da quando ho iniziato a usare fprintf.
Anche se durante un ciclo si dovrebbe fermare a ricevere caratteri parte,ecco un' immagine del prompt:
http://img574.imageshack.us/img574/6863/immaginepgy.jpg
Finora aveva sempre funzionato,ma anche con fflush non risolvo :dh:
Questo programma deve presentare una sorta di men iniziale dove l' utente sceglie di digitare un numero.Se digita 1 parte la funzione immetti_dati,l' altra non l' ho ancora scritta.
Ma in teoria cliccando 1 dovrebbe entrare nella funzione,invece rimane nella main ignorando fscanf e continua a stampare.
Non ci sono ne errori ne avvisi in compilazione.
Ecco il codice:


#include"ramy.h"

typedef struct
{
int eta;
float media;
char *nome;
char *cognome;
}studente;

studente* immetti_dati(char*);
void stampa_dati(char*);
char* ottieni_stringa(char*ptr);

int main()
{
char ctr=-1;
int num=0;
while(ctr<49||ctr>51)
{
if(num>0)
fprintf(stdout,"Scelta non valida,\nMenu':\n1)Digita dati studenti;2)Stampa dati studenti;3)esci");
else
fprintf(stdout,"Inserimento dati studente,benvenuto.\nMenu':\n1)Digita dati studenti;2)Stampa dati studenti;3)esci");
fscanf(stdin,"%c",&ctr);
num++;
getchar();
if(ctr==49)
immetti_dati(&ctr);
else
stampa_dati(&ctr);
}
return 0;
}

studente* immetti_dati(char*ptr)
{
FILE *fp;
char ctr=-1,*file;
int counter=0;
studente *p;
p=(studente*)malloc(sizeof(studente));
(*p).nome=(char*)malloc(sizeof(char));
(*p).cognome=(char*)malloc(sizeof(char));
do
{
if(counter==0)
fprintf(stdout,"Su quale file vuoi salvare i tuoi dati?\n");
else
fprintf(stdout,"Scelta non valida,digitare il nome di un file seguito da .txt\n");
fscanf(stdout,"%s",file);
fopen(file,"w");
counter++;
}while(fp==NULL);
do
{
fprintf(stdout,"Immissione dati studente %d (max 10),immetti eta': ");
fscanf(stdin,"%d",(*p).eta);
fprintf(fp,"%d",(*p).eta);
fprintf(stdout,"\nImmetti media (valore in float):");
fscanf(stdin,"%f",(*p).media);
fprintf(fp,"%.2f",(*p).media);
fprintf(stdout,"\nImmetti nome: ");
(*p).nome=ottieni_stringa((*p).nome);
fputs((*p).nome,fp);
fprintf(stdout,"\nImmetti cognome: ");
(*p).nome=ottieni_stringa((*p).nome);
fputs((*p).cognome,fp);
}while(ctr!=48);
*ptr=-1;
return p;
}

void stampa_dati(char*ptr)
{
*ptr=-1;
}

char* ottieni_stringa(char*ptr)
{
ptr=(char*)malloc(sizeof(char));
int i=1;
char ci;
fflush(stdin);
while(ci!=10)
{
ci=getchar();
if(ci!=10)
ptr[i-1]=ci;
ptr=(char*)realloc(ptr,(i+1)*sizeof(char));
i++;
}
ptr[i-2]='\0';
return ptr;
}

simo_85
07-12-2010, 01:41
Originariamente inviato da ramy89

Usa un do-while al posto del while. normale che il ciclo si ripete mentre il valore di ctr rientra nel rango della condizione.. Lo dice il while stesso..
:ciauz:

Loading