Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Non finisce piu' di stampare, fflush vs getchar

    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:
    codice:
    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:

    Finora aveva sempre funzionato,ma anche con fflush non risolvo
    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:
    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;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C]Non finisce piu' di stampare, fflush vs getchar

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.