C++ ja luku

Koodari

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???

13

1257

    Vastaukset 13

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 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 ) {
        cerr

        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?


      • 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 ) ) {
        cout

        Todellakin 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 ) ) {
        cout

        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?


      • 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


      • 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

    1. Törkeä petosepäily Suomussalmella

      Uutisoi maikkari. Uhrin nimiin on nostettu pankkilainaa, hänet on saatu sijoittamaan hevosiin ja ostamaan autoja. Ei ta
      Suomussalmi
      68
      3020
    2. Poliisi etälamautti, sitten pahoinpiteli

      Vaikeasti kehitysvammaisen niin vakavasti että kuoli pian sairaalassa. Ei osannut kehitysvammainen heti noudattaa polii
      Maailman menoa
      364
      1129
    3. Mies, olen pahoillani kun olen kuvitellut

      Että pitäisit minusta. En sitä mistään tähdistä kuitenkaan lukenut, mulle vaan tuli jostain semmoinen tunne, kun itse ty
      Ikävä
      64
      772
    4. Anni Ihamäki saa tylyä kommenttia TTK:sta - Erityisesti tämä "vääryys" ärsyttää

      Kaikille ei ole mieleen se, että Anni Ihamäki on mukana uudella Tanssii Tähtien Kanssa -kaudella. Ihamäki saa varsin ty
      Kotimaiset julkkisjuorut
      32
      729
    5. Mitä et ole valmis sietämään ihmissuhteissasi ja miksi?

      Aiemmin jo kyseltiin mitkä vaatimukset olivat mielestänne liiallisia. Kyselläänkin nyt sitä, että millaisilla asioilla s
      Sinkut
      261
      626
    6. Päivän Riikka: Pandan suklaatehdas Jyväskylästä Viroon

      Menkää töihin! Viroon! --- Liki sata vuotta kestänyt suklaantuotanto makeisvalmistaja Pandan tehtaalla Vaajakoskella pä
      Maailman menoa
      136
      584
    7. Tiesitkö? Vappu Pimiän ensimmäinen aviomies ei ole Teemu-rakas

      Vappu Pimiä on tätä nykyä naimisissa Teemu Huuhtasen kanssa. Pimiä on toista kertaa naimisissa, sillä ensimmäinen liitto
      Kotimaiset julkkisjuorut
      19
      559
    8. Älä nyt ylikuormitu vaikka sinusta pidänkin rakas nainen

      Tiedän, että olet minulle oikea. En halua pilata tätä juttua malttamattomuudella, mutta epäilen. Haluan vain olla lähel
      Ikävä
      30
      524
    9. Sysmä tarvitsee päätöksiä

      Sysmä tarvitsee päätöksiä – ei p*anjauhantaa** Kirjoitan kuntapolitiikan ulkopuolisena tarkkailijana. Sysmän poliittinen
      Sysmä
      17
      505
    10. Älä katoa elämästäni

      Kävelyllä mietin olisitpa varjo takanani vierelläni sivullani Älä katoa koskaan ole siinä pidä kädestäni kiinni ole kan
      Ikävä
      29
      489
    Aihe