Supponiamo di avere un menu che presenta all'utente alcune opzioni:Strano comportamento durante la lettura in int da STDIN
Welcome:
1) Do something
2) Do something else
3) Do something cool
4) Quit
L'utente può premere 1 - 4 e poi il tasto Invio. Il programma esegue questa operazione e quindi presenta il menu all'utente. Un'opzione non valida dovrebbe solo visualizzare nuovamente il menu.
Ho la main()
seguente metodo:
int main()
{
while (true)
switch (menu())
{
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
case 3:
doSomethingCool();
break;
case 4:
return 0;
default:
continue;
}
}
e il follwing menu()
:
int menu()
{
cout << "Welcome:" << endl
<< "1: Do something" << endl
<< "2: Do something else" << endl
<< "3: Do something cool" << endl
<< "4: Quit" << endl;
int result = 0;
scanf("%d", &result);
return result;
}
Entrando tipi numerici grandi opere. L'immissione di 1 - 4 fa sì che il programma esegua l'azione desiderata e in seguito il menu viene nuovamente visualizzato. Immettendo un numero al di fuori di questo intervallo, ad esempio -1 o 12, verrà visualizzato di nuovo il menu come previsto.
Tuttavia, l'inserimento di qualcosa come "q" causerà semplicemente la visualizzazione infinita del menu, senza nemmeno fermarsi per ottenere l'input dell'utente.
Non capisco come possa accadere. Chiaramente, menu()
viene chiamato come il menu viene visualizzato più e più volte, tuttavia scanf()
è parte di menu()
, quindi non capisco come il programma ottiene in questo stato di errore in cui l'utente non viene richiesto per il loro input.
Originariamente avevo cin >> result
che ha fatto esattamente la stessa cosa.
Edit: Ci sembra essere un related question, tuttavia l'originale source code è scomparso da pastebin e uno dei link risposte a un article che a quanto pare, una volta spiegato perché questo sta accadendo, ma ora è un link morto. Forse qualcuno può rispondere con il motivo per cui questo sta accadendo piuttosto che il collegamento? :)
Edit: Utilizzando this example, ecco come ho risolto il problema:
int getNumericalInput()
{
string input = "";
int result;
while (true)
{
getline(cin, input);
stringstream sStr(input);
if (sStr >> result)
return result;
cout << "Invalid Input. Try again: ";
}
}
e ho semplicemente sostituito
int result = 0;
scanf("%d", &result);
con
int result = getNumericalInput();
possibile duplicato di [Una semplice domanda su cin] (http://stackoverflow.com/questions/5864540/a-simple-question-about-cin) –