Salve a tutti
il seguente codice va in loop infinito
il codice dovrebbe accettare un numero in input è se uno involontariamente inserisce una lettera o preme ctrl+c il programma dovrebbe riaccettare l'input.
ma ahime non fa ciò che dovrebbe fare la prima volta fa accettare l'input ma in caso di falso input,cioè inserisco un carattere al posto di un numero, va in loop infinito.
int n; retu=SetConsoleCtrlHandler( (PHANDLER_ROUTINE) mysethandle, TRUE);
vedi_flag();
primo: a=0;
cout << "ecco i flag di stream prima dell' input\n";
cout << "variabile a = " << a <<"\n";
cout << "input n : "; cin >>n;
cout << "\nvaiabile retu = " << retu << "\n";
vedi_flag(); a=cin.fail();
if (a==1)
{
cin.clear (); a=0;
cout << "\n rieseguiamo l'input per falsovalore\n";
goto primo;
}
a=cin.rdstate();
if (a > 1) {
cin.clear(); cin.ignore();
cout << "\n interruzione per ctrl+c input sbagliato riprova\n";
goto primo;
}
cout << "premi quello che vuoi per terminare\n";
cin >>n; return 0;
se vi puo servire inserisco anche lo schema dei flag.
stato iniziale
flag Valore
Rdstate 0
Eof 0
Fail 0
Bad 0
Good 1
Stato dopo input corretto
flag Valore
Rdstate 1
Eof 0
Fail 0
Bad 0
Good 1
Stato dopo input errato
Flag Valore
Rdstate 2
Eof 0
Fail 1
Bad 0
Good 0
per finire una domanda che può sembrare sciocca come faccio ad azzerare un solo flag senza doverli azzerare tutti con la cin.clear ?
grazie a chiunque mi spieghi il comportamento anomalo del codice su indicato
p.s.della discussione sul uso/non uso del goto sinceramente non me ne frega niente!