Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ -  gets dopo scanf non funziona
Forum - C/C++ - gets dopo scanf non funziona

Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 14:44
Giovedì, 14/10/2010
ho cercato nel forum altre domande sulla funzione gets e visto che non le ho trovate ho postato la mia :)
ho creato un piccolo programma come esercizio per scrivere strutture su un file
la struttura comprende un nome e un indirizzo per il nome uso la scanf mentre
per l'indirizzo essendo formato da una stringa con spazi ho usato la gets
il programma si comportava in modo apparentemente incomprensibile saltando
la gets ho risolto provando a mettere un getchar() dopo la scanf e funziona ma
NON HO LA MINIMA IDEA del  perchè si verifichi questo comportamento e perchè
si risolva cono un getchar() che tra l'altro non è immediatamente precedente al gets ho provato ad usare due scanf in sucesione è il problema non si è verificato
ho compilato con due compilatori differenti e il problema  persiste
premetto che non ci avevo mai fatto caso :)
posto il codice
Codice sorgente - presumibilmente Delphi

  1. void scrivi(void)
  2. {
  3.     s a;
  4.     FILE *w;
  5.     w=fopen("x.txt","ab");
  6.     if (w==NULL)
  7.        printf("inpossibile scrivere sul file n");
  8.     printf("SCRIVI :\n-------------------------\n");  
  9.     printf("inserisci il nome : ");
  10.     scanf("%s",a.nome);
  11.     getchar();  //senza il getchar() sembra che salti la gets()
  12.     printf("inserisci l' indirizzo : ");
  13.     gets(a.indirizzo);
  14.     fwrite(&a,sizeof(a),1,w);
  15.     fclose(w);
  16.     printf("scrittura su file avvenuta con successo\n");
  17.    
  18.     }



PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
4
Down
V
Segnala al moderatore
Postato alle 15:43
Giovedì, 14/10/2010
è semplice: la scanf lascia nel buffer un carattere di fine riga '\n'. Quando chiami getchar(), in pratica togli questo carattere dal buffer facendo si che la gets funzioni senza problemi. Senza il getchar(), la gets legge come primo carattere un '\n' e si interrompe subito.

Dovresti poter risolvere il problema inserendo il carattere di fine riga direttamente nella stringa di formattazione di scanf

in pratica invece di
scanf("%s",a.nome);

metti
scanf("%s\n",a.nome);

Ovviamente poi togli il getchar() e verifica se la mia correzione ha funzionato o meno...

PM
Avatar
Overflow (Normal User)
Expert


Messaggi: 334
Iscritto: 11/01/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 16:56
Venerdì, 15/10/2010
utilizza dopo la scanf la fflush(stdin), come diceva TheKaneB la scanf lascia nel buffer il carattere newline, attraverso la fflush(stdin) ripulisci il buffer.

PM
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 14:47
Giovedì, 14/10/2010
Premetto che la s nel codice è un tipo struct globale con un char nome[20]
e un char indirizzo[80]

PM
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 13:57
Venerdì, 15/10/2010
Testo quotato

Postato originariamente da TheKaneB:

è semplice: la scanf lascia nel buffer un carattere di fine riga '\n'. Quando chiami getchar(), in pratica togli questo carattere dal buffer facendo si che la gets funzioni senza problemi. Senza il getchar(), la gets legge come primo carattere un '\n' e si interrompe subito.

Dovresti poter risolvere il problema inserendo il carattere di fine riga direttamente nella stringa di formattazione di scanf

in pratica invece di
scanf("%s",a.nome);

metti
scanf("%s\n",a.nome);



grazie della spiegazione :k:
ho provato ad inserire il carattere \n ma questa volta salta la printf() sucessiva
alla scanf passando subito al gets()  
poi non so perche' se si usano due scanf consecutive il problema non c'e  
credo che userò il getchar() sperando di ricordarmi la soluzione ogni volta che mi compare il problema

Ovviamente poi togli il getchar() e verifica se la mia correzione ha funzionato o meno...


PM