C++ ja luku

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???
131258
Äänestä

Muut lukivat myös

Vastaukset 13

Vanhimmat

En ole ihan varma, mutta käviskö joku if( cin ) { tyylinen ratkasu.

Äänestä
  • 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...

    Äänestä

  • 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

    Äänestä

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

    Äänestä

  • 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

    Äänestä

  • 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... =)

    Äänestä

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

    Äänestä

  • 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

    Äänestä

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

    Äänestä

piruuttaan kokeilin Visual C (2005) ja se ei herjaa mitään. Jos kirjoitan vaikka nimeni, niin i:n arvo on nolla. Ohjelma ei sekoa...

Äänestä
  • Joo eli mulla on Borlandin C Development Suite, 5.02 Versio.

    Äänestä

Kommentoi aloitusta


Koodari kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu