Ach jo, lidi jak mam udělat jednoduše ošetření vstupu ? Aby mi někdo do INT nezadal znak? Zkoušel jsem to takhle:
int x;
do{
cin >>x;
}while (!isdigit(x));
Ale to mi nějak nefunguje :( Nevim proč.
Ach jo, lidi jak mam udělat jednoduše ošetření vstupu ? Aby mi někdo do INT nezadal znak? Zkoušel jsem to takhle:
int x;
do{
cin >>x;
}while (!isdigit(x));
skus dať vstup do bloku try.
http://www.ehoy.wz.cz/view.php?cisloclanku=2007020001
To vollf82: Je to proto, že při chybném vstupu se nastaví bit eofbit, badbit nebo failbit v závislosti na druhu chyby. Tím se zablokuje další načítání.
Řešení:
if (cin.fail()&&!cin.bad()) { //pokud je vstup chybný
cin.clear(); //vymaže bity uvedené výše
while (!isspace(cin.get())) //přeskočí chybný vstup
continue;
cin >> a;
}
//zde opět funguje vstup
To Matrix17: Díky pomohlo to. Jen prosím jedno vysvětlení - co přesně dělá cin.get() ? To bere znak po znaku odkud ? Z paměti ? Protože pokud tomu dobře rozumím, tak to bude brát znak po znaku dokud se ten znak nebude rovnat bílýmu znaku a tím continue; je zajištěno, že nám vlastně kursor (pomyslnej) pojede znak po znaku dopředu dokud nenarazí na mezeru. Je to tak ?
A pak to zas bude čekat na vstup - cin >>a;
Nerozumím totiž, proč by nestačilo to cin.clear(). To přece všechny ty špatný znaky (bity) vymaže tak proč pak hned nefunguje ten další vstup cin>>a; ?
Díky
cin.clear() nestačí, protože vymaže pouze bity, co detekují chybu vstupu. Čili to, co je buffru tam zůstane. Tím, že je vymažeš povolíš další vstup a pak musíš vyčistit buffer aby nedošlo k opětovnýmu nastavení těchto bitů a jeho zablokování. Abych nezapoměl cin.get() opravdu bere znak po znaku a předává ho jako parametr funkci isspace(), která ho vyhodnotí a když je to bílý znak cykl končí.
Tohle "//zde opět funguje vstup" by mělo bejt už před cin >> a;
To Matrix17: A tim cin.get() v tom cyklu teda mažu přímo ten buffer? Dokud to nenarazí na bílý znak?
To midin:
To myslíš jako celej kód toho co tvořim nebo jen co se týká ošetření toho vstupu? Já jsem to poupravil a napsal takhle - funguje to:
cin >>x;
while (!cin.good()) {
cin.clear();
while (!isspace(cin.get()))
continue;
cout <<"\nMus"<<ii<<"te zadat po"<<r<<"adov"<<e<<" "<<c<<ii<<"slo souboru: ";
cin >> x;
}
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku