PDA

View Full Version : [C] Problema gets()


bobosg
19-05-2010, 11:40
ciao a tutti
il problema è che con i=1 (quindi alla seconda iterazione del ciclo for, mi salta il gets dell'artista e passa al titolo con un output di questo genere

Artista: Pinco Pallino
Titolo: Pinco
Titolo Album: Pallino
Durata: 260
Artista: Titolo: _

il codice è il seguente:
for(i=0;i<2;i++){
printf("Artista: ");
gets(vettMultimedia[i].artist);
printf("Titolo: ");
gets(vettMultimedia[i].title);
printf("Titolo album: ");
gets(vettMultimedia[i].albumTitle);
printf("Durata: ");
scanf("%d", &vettMultimedia[i].duration);
}
qualcuno sa aiutarmi?

Teo@Unix
19-05-2010, 11:57
può anche essere che artista è vuoto!?

bobosg
19-05-2010, 11:58
può anche essere che artista è vuoto!?

ma quello è l'output in fase di input
cioè è quello che mi compare sullo schermo quando mi chiede di inserire i vari campi

DanieleC88
19-05-2010, 12:45
La scanf() non toglie '\n' dal buffer di input, così alla successiva gets() è come se tu ricevessi subito l'invio.

Non usare mai gets(), comunque, usa sempre fgets().

bobosg
19-05-2010, 12:56
La scanf() non toglie '\n' dal buffer di input, così alla successiva gets() è come se tu ricevessi subito l'invio.

Non usare mai gets(), comunque, usa sempre fgets().

non esiste una soluzione???
fgets legge da file devo usare gets

DanieleC88
19-05-2010, 13:03
Una veloce soluzione è togliere a mano tutti i caratteri rimasti nel buffer finché non c'è un invio:
scanf(...);
while (getchar() != '\n') {
/* non fareniente di niente */
}

Comunque: http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
Nessuno ti vieta di usare stdin come stream di input.

bobosg
19-05-2010, 13:57
non lo so, non mi convince.
cmq inizialmente avevo provato con scanf che funziona alla grande se non fosse che quando vede uno spazio pensa che sto scrivendo già il campo successivo...:mc:

DanieleC88
19-05-2010, 14:04
non lo so, non mi convince.
Non ti convince la fgets()? :mbe:
Comincia ad usarla, invece! Purtroppo la gets() non fa alcun controllo sulla lunghezza dell'input, e ti espone a rischi di stack smashing e robaccia simile.
cmq inizialmente avevo provato con scanf che funziona alla grande se non fosse che quando vede uno spazio pensa che sto scrivendo già il campo successivo...:mc:
Be', sai com'è, la scanf() è fatta per leggere "campi", non per ricevere righe in input. :)

ciao ;)