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;
}