Newsgroup: it.comp.lang.c
Titolo: Chi mi aiuta?

Ciao a tutti, č la prima volta che partecipo a questo newsgroup anche se lo
seguo da molto tempo dato che il C č per me IL lunguaggio di programmazione.
 In un esercizio del professore della mia facolta' ho trovato un banale
esempio che illustrava la gestione delle strutture in C. Con mio stupore,
una volta inserito e compilato il codice, mi sono reso conto che
l'eseguibile non funzionava. In pratica la "gets" del campo "cognome" della
struttura non viene eseguita. Ho risolto la cosa cosě come indicato nel
sorgente che segue. Attivando la seconda "scanf" la "gets" viene eseguita, e
la seconda "scanf" no, perché? In tutta la documentazione in mio possesso
relativa alla "scanf" e alla "gets" non ho trovato risposte. Ho compilato il
sorgente con il Borland C++ 4.5, con il DJGPP e con LCC. Tutti e tre i
compilatori si comportano allo stesso modo.
Grazie in anticipo.
#include <stdio.h>
#define MAX_ELE  15
struct dato {
 char cognome[20];
    char nome[20];
    int  eta;
} persona[MAX_ELE];
int  index;
void ins(void);
main()
{
  int  scelta;
    char c;
    printf("Scelta: ");
    scanf("%d", &scelta);
    /**** scommentando questa riga funziona !!!
    scanf("%c", &c);
    ****/
    ins();
}
void ins()
{
 if (index > MAX_ELE)
      return;
  printf("\n\nINSERIMENTO\n");
  printf("Cognome: ");
  gets(persona[index].cognome); /* Non viene eseguita */
  printf("Nome: ");
  gets(persona[index].nome);
  printf("Eta': ");
  scanf("%d", &persona[index].eta);
  ++index;
  return;
}

    ****/
Esatto, perche' leggi il carattere new-line, ma non e' sufficiente.
Anziche' questa istruzione prova a scrivere :
while (getchar() != '\n') ;
Vedrai che funziona.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

Se proprio devi usare gets(), prima usa la fflush(stdin)
Dome

Se proprio devi usare gets(), prima usa la fflush(stdin)
fflush, applicata a stream di input non ha alcun significato su certi
sistemi e potrebbe anche formattare il disco ;) .
Secondo lo standard, fflush e' definita solo per gli stream di output.


Francamente non ho mai capito come funzioni fflush... vedo che se uso gets
(quindi stdin->stdout) va bene e sono contento...in passato ho fatto giri
assurdi per evitare sti problemi. (e non solo questi...sotto dos gets prende
al max 128 char per volta e mi sono dovuto sbattere con asm + logica +
intelligenza per scrivere una funzione decente....)
Dome

Grazie a tutti per l'aiuto datomi. Avevo pensato che la scanf leggesse più
di un carattere, e dato che ritorna il numero delle variabili lette ho anche
pensato di visualizzare questo numero, purtroppo senza risultati (in questo
caso ritornava "1"). Lavoro come programmatore da più di dieci anni e
programmo in C, chiaramente non adopero mai queste funzioni per l'input ma
dato che all'università per insegnare il linguaggio le adoperano... pensavo
che mi sfuggisse qualcosa di talmente scontato e banale da non accorgermi
dell'errore.
Grazie di nuovo.

(quindi stdin->stdout) va bene e sono contento...
Sarai contento fino a che non cambierai sistema/compilatore.
Come gia' detto, fflush non ha comportamento definito per gli stream
di input.



Grazie per aver risposto al mio appello.
Lavoro come programmatore da 10 anni e avevo già intuito che il problema era
interno alla scanf (funzione che non mi è mai capitato di utilizzare a
livello professionale). Il dubbio che mi rimane è questo: possibile che ad
un esame universitario si devono presentare sorgenti sintatticamente
corretti ma che in pratica non funzionano? E' solo uno sfogo personale,
scusatemi.
Ciao.