Kuinka tarkastan koodissa että syöte on oikein?
Eli alla oleva koodi:
int luku;
cin >>luku;
Jos syötän jonkin muun kuin numeron niin ohjelma kaatuu/sekoaa... Miten saan blokattua että ohjelma osaa palauttaa jonkin virheen kun syöttää esimerkiksi jonkin kirjaimen???
C++ ja luku
13
1193
Vastaukset
- Canopus
En ole ihan varma, mutta käviskö joku if( cin ) { tyylinen ratkasu.
- Koodari
if((cin >> luku) != 0)
Tuolla sain kyllä erotettua sen että oliko luku vaiko merkki. Mutta silti se ei oikee näyttäny tehoavan... Vaikka heti yritin sijoittaa tuohon luku-muuttujaan jonkin arvon kun siihen oli menny merkki.
Et ei oikee toimi... - Canopus
Koodari kirjoitti:
if((cin >> luku) != 0)
Tuolla sain kyllä erotettua sen että oliko luku vaiko merkki. Mutta silti se ei oikee näyttäny tehoavan... Vaikka heti yritin sijoittaa tuohon luku-muuttujaan jonkin arvon kun siihen oli menny merkki.
Et ei oikee toimi...kokeile tämmöstä:
int main() {
int i = 0;
cin >> i;
if( ! cin ) {
cerr - Koodari
Canopus kirjoitti:
kokeile tämmöstä:
int main() {
int i = 0;
cin >> i;
if( ! cin ) {
cerrkyllä tuo koodi toimii noin joo... Mutta en haluaisi lopettaa sitä break:iin vaan haluaisin että ohjelma toipuu tuosta ja jatkaa suoritusta.
Mites tuo sitten silmukassa? Jos kyselen ihan vain silmukassa lukuja ja tulee tuollainen virhe vastaan? Nyt ohjelma automaattisesti vastaa jo seuraavaan luvun kysymykseen ja pyörii siten loopissa...
Outoa? - Canopus
Koodari kirjoitti:
kyllä tuo koodi toimii noin joo... Mutta en haluaisi lopettaa sitä break:iin vaan haluaisin että ohjelma toipuu tuosta ja jatkaa suoritusta.
Mites tuo sitten silmukassa? Jos kyselen ihan vain silmukassa lukuja ja tulee tuollainen virhe vastaan? Nyt ohjelma automaattisesti vastaa jo seuraavaan luvun kysymykseen ja pyörii siten loopissa...
Outoa?int main() {
int luku = 0;
while ( ! (cin >> luku ) ) {
cout - Koodari
Canopus kirjoitti:
int main() {
int luku = 0;
while ( ! (cin >> luku ) ) {
coutTodellakin toimii joo. Hienoa. Kiits Canopus.
Mitäs noi käytännössä tekee noi clear ja ignore:
cin.clear();
cin.ignore( true, '\n' );
Jotain ne tyhjää ja...
Pääasia että tuo tuli selväksi. Täs käyttäjärajapinnan koodaamisessa saa ottaa kaikki huomioo ko yleensä käyttäjät on toheloita... =) - Koodari
Canopus kirjoitti:
int main() {
int luku = 0;
while ( ! (cin >> luku ) ) {
coutMuuten jos tuon esimerkkikoodin suorittaa ja siinä kun se kysyy tuota lukua niin jos siihen kirjoittaa esim: qwerty niin se tulostaa 6 kertaa tuon virhetekstin... Miksiköhän...??
Mitenköhän tuon saisi linjaan? - Canopus
Koodari kirjoitti:
Muuten jos tuon esimerkkikoodin suorittaa ja siinä kun se kysyy tuota lukua niin jos siihen kirjoittaa esim: qwerty niin se tulostaa 6 kertaa tuon virhetekstin... Miksiköhän...??
Mitenköhän tuon saisi linjaan?Elikkäs tuo cin.clear();. Kun tietovirtaa käsiteltäessä tapahtuu virhe ja virta menee jumiin, niin clear()-funktiolla tästä tilasta voidaan päästä pois ja saada systeemi taas pelittämään.
Sitten tuo cin.ignore( true, '\n' );. Elikkä cin.ignore( montako, merkki ), lukee virrasta korkeintaan "montako" merkkiä tai niin pitkään kun tulee vastaan "merkki". Tuossa koodinpätkässämme siis luetaan loputtomasti merkkejä( true ) tai niin pitkään kun tulee vastaan rivinvaihto ( '\n' ).
Niin joo tuohan tosiaan lukee syötettä niin pitkään kun sitä sieltä tulee ja siksi se tulostaa jokaisen merkin kohdalla virhetekstin. En ottanut tuota huomioon tuota ohjelmaa naputellessani. Tässä onkin siis uusi koodinpätkä, joka on vähän fiksumpi kuin tuo aikaisempi nopeasti kyhätty ratkaisu, jossa varmistetaan, että syötteen perässä ei ole mitään turhaa.
#include
#include
#include
#include
using namespace std;
int main() {
cout luku ) && !( str >> turhaa ) ) {
break;
}
cout
http://www.cplusplus.com/ref/#libs
iostream library->ios->ios members
Muistaakseni jotenkin noin, eli katsomalla joidenkin noiden arvoja.- Koodari
Tsekkasin noita läpi mutta en niistä oikeen tullu viisaammaksi... Tai en oikeen tiedä miten niitä pitäis käyttää, esim joku bad_bitti tai fail tai jotain... Pitäis olla rautalanka josta vääntää...
Ääh, tämäm meni vaikeaksi...
- minä...
piruuttaan kokeilin Visual C (2005) ja se ei herjaa mitään. Jos kirjoitan vaikka nimeni, niin i:n arvo on nolla. Ohjelma ei sekoa...
- Koodari
Joo eli mulla on Borlandin C Development Suite, 5.02 Versio.
- http://www.mit.jyu.fi/opetu...
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
57-vuotiads muka liian vanha töihin?
On tämä sairas maailma. Mihin yli 55-vuotiaat sitten muka enää kelpaavat? Hidasta itsemurhaa tekemään, kun eläkkeelle ei3884792Haluatteko miellyttää kumppaninne silmää?
Entä muita aisteja? Mitä olette valmiita tekemään sen eteen että kumppani näkisi teissä kunnioitettavan yksilön? Olette2852641By the way, olet
mielessäni. Olet minulle tärkeä, niin suunnattoman tärkeä. En kestäisi sitä jos sinulle tapahtuisi jotain. Surullani ei1541906Onko kaivattunne suosittu?
Onko teillä paljon kilpailijoita? Mies valitettavasti näyttää olevan paljonkin naisten suosiossa :(1041628J-miehelle toivon
Hyvää yötä. Voisiko nykyistä tilannetta uhmaten vielä pienintäkään toivetta olla, päästä kainaloosi joskus lepääämään.851493Täytyi haukkuu sut lyttyyn
En haluu tuntee rakkautta sua kohtaan enää ja haluun unohtaa sut mut sit tulee kuiteki paha olo kun haluis vaan oikeesti611347- 601335
Kylpyläsaaren Lomakylän kahvilaravintola
Kävimme syömässä Kylpyläsaaressa. "Naudanliha burgeri" maksoi 18,90 euroa ja lisäksi limsa 4,50 euroa. Annoksen hinnaks621287Onkohan sulla enää tunteita
kun nähdään seuraavan kerran? Niin hyvä fiilis on ollut viime aikoina, että se on nyt pahin pelkoni. Oletkohan unohtanut481282Rakkauden riemuvoitto
Valta voidaan voittaa tiedolla. Mutta tieto on huonompi kuin kauneus, hellyys ja rakkaus. Siksi kauneus on vallan ja tie3491091