Oppure

Loading
14/10/10 12:44
torn24
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

void scrivi(void)
{
    s a;
    FILE *w;
    w=fopen("x.txt","ab");
    if (w==NULL)
       printf("inpossibile scrivere sul file n");
    printf("SCRIVI :\n-------------------------\n");  
    printf("inserisci il nome : ");
    scanf("%s",a.nome);
    getchar();  //senza il getchar() sembra che salti la gets() 
    printf("inserisci l' indirizzo : ");
    gets(a.indirizzo);
    fwrite(&a,sizeof(a),1,w);
    fclose(w);
    printf("scrittura su file avvenuta con successo\n");
    
    }


aaa
14/10/10 12:47
torn24
Premetto che la s nel codice è un tipo struct globale con un char nome[20]
e un char indirizzo[80]
aaa
14/10/10 13:43
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);

Ovviamente poi togli il getchar() e verifica se la mia correzione ha funzionato o meno...
aaa
15/10/10 11:57
torn24
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...
aaa
15/10/10 14:56
Overflow
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.
aaa