PDA

View Full Version : [C++] Input da console


vendettaaaaa
19-09-2013, 22:14
cout << "Where do you want to shoot your arrow?" << endl;
char c; cin.get(c); if (c != '\n') cin.putback(c); // Needed to clear the buffer from the newline char
getline(cin, choice);

Mi sono imbattuto in questo problema oggi. Praticamente, avendo mischiato >> e getline, capitava, prima che inserissi la seconda riga, che dopo il cout il programma andasse avanti senza aspettare l'input dell'utente. Dopo un po' ho capito che nel buffer di cin rimane un \n che causa quindi a getline di uscire subito (perchè interrompe la lettura quando incontra un char delimitatore, che di default è proprio \n).

Vi chiedo: ci sono modi più eleganti di ovviare al problema o l'unica è togliere a mano \n dal buffer?

[Kendall]
21-09-2013, 07:46
Prova anche con questo:


fflush( stdin );

vendettaaaaa
23-09-2013, 09:45
Mi piace la proposta di Kendall, mentre eviterei scanf visto che fa la stessa cosa di getc ma in stile C :banned: :D

[Kendall]
23-09-2013, 10:10
Ecco, piccolo appunto, non so se l'fflush sia prestazionalmente più o meno performante del togliere a manina caratteri dal buffer. C'è anche da dire che se è una operazione non sensibile il discorso performance diventa relativamente di poco interesse.

psico88
23-09-2013, 11:47
Se vuoi rimanere in "stile" C++:


cin.ignore(cin.rdbuf()->in_avail(), '\n');

vendettaaaaa
23-09-2013, 14:16
Se vuoi rimanere in "stile" C++:


cin.ignore(cin.rdbuf()->in_avail(), '\n');

Aaaahhh rdbuf va a leggere dal buffer anzichè pescare nuovi caratteri dalla console, ottimo! :D

@Antonio: l'unica cosa perversa di << e >> è quello che hanno ficcato nell'header iomanip, infatti se devo stampare dati formattati uso ancora printf("%-12.4E eccetera :D
L'overload di << invece è come l'override di ToString() nel C#, molto comodo a mio parere...

@Kendall: non servono prestazioni, faccio quel mestiere una volta ogni tanto quando l'utente deve scrivere. Cmq terrò a mente il potenziale problema, grazie.

vendettaaaaa
23-09-2013, 19:06
Trovato per caso il modo più elegante:
cin >> std::ws; getline(cin, mystring);
:cool: