Ošetření vstupů – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ošetření vstupů – C / C++ – Fórum – Programujte.comOšetření vstupů – C / C++ – Fórum – Programujte.com

 

Mirek Braho0
Stálý člen
25. 4. 2007   #1
-
0
-

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č.

Nahlásit jako SPAM
IP: ...–
Peter D.0
Expert
25. 4. 2007   #2
-
0
-
Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Matrix17
~ Anonymní uživatel
300 příspěvků
25. 4. 2007   #3
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
25. 4. 2007   #4
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
25. 4. 2007   #5
-
0
-

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;

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
26. 4. 2007   #6
-
0
-

To Matrix17: A tim cin.get() v tom cyklu teda mažu přímo ten buffer? Dokud to nenarazí na bílý znak?

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
26. 4. 2007   #7
-
0
-

To vollf82: Jj přesně tak.

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
26. 4. 2007   #8
-
0
-

To vollf82: Mohl by jsi sem dát celý ten výsledný kód? Díky.

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
26. 4. 2007   #9
-
0
-

Ještě jedna technická když dáš místo podmínky if cykl while bude to ještě blbovzdornější.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
27. 4. 2007   #10
-
0
-

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;
}

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
27. 4. 2007   #11
-
0
-

To vollf82: Díky, nějak jsem se tu v tom neorientoval.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 90 hostů

Podobná vlákna

Ošetření vstupu — založil Caken

Ošetření vstupu — založil Troy585

Ošetření vstupu — založil Erlesh

Osetreni vstupu — založil Prometheus

Ošetření vstupu — založil Koja

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý