c-kieli syötteen tarkastaminen

mikä on c-kielen kätevin tapa tarkistaa että syöte on haluttua muotoa. Esim ohjelmani vaatii syötteeksi pelkkiä numeroita. Kiitos
81223
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

Riippuu millä funktiolla luet syötteen. Katso siis mitä arvoja käyttämäsi funktio palauttaa, jos funktiolle antaa virheellisen syötteen.

Äänestä
  • eli käytän scanf-funktiota ja löysin jo sen palautusarvon jos menee pieleen. onko tästä enää mahdollisuuksia toipua vai täytyykö ohjelma sammuttaa välillä. Itse tein seuraavan ratkaisun:

    int luku;
    if(0==(scanf("%d", &luku)))
    {   
    fprintf(stderr, "VIRHE!\n", "");
    return -1;
    }

    mutta tässä tapauksessa minun täytyy sammuttaa ohjelma vai onko pakko??

    Äänestä

  • juussto kirjoitti:

    eli käytän scanf-funktiota ja löysin jo sen palautusarvon jos menee pieleen. onko tästä enää mahdollisuuksia toipua vai täytyykö ohjelma sammuttaa välillä. Itse tein seuraavan ratkaisun:

    int luku;
    if(0==(scanf("%d", &luku)))
    {   
    fprintf(stderr, "VIRHE!\n", "");
    return -1;
    }

    mutta tässä tapauksessa minun täytyy sammuttaa ohjelma vai onko pakko??

    Kysy vaikka while lausekkeessa uudestaan niin kauan kunnes saadaan hyväksyttävä syöte.

    Äänestä

  • Keijo kirjoitti:

    Kysy vaikka while lausekkeessa uudestaan niin kauan kunnes saadaan hyväksyttävä syöte.

    Lisää siihen vielä sydeemi, jolla esc painallus keskeyttää ohjelman.

    Äänestä

  • Keijo kirjoitti:

    Kysy vaikka while lausekkeessa uudestaan niin kauan kunnes saadaan hyväksyttävä syöte.

    koodissa kutsun funktiota seuraavasti:

    int luku;
    while((luku = kysyLuku())==-1);

    ja funktio kysyLuku():

    int kysyLuku()
    {
    int luku=0;

    printf("Anna luku\n");
    if(0==(scanf("%d", &luku)))
    {   
    fprintf(stderr, "VIRHE!\n", "");
             
    return -1;
    }

    return luku;
    }


    niin jos syöttää vaikka kirjaimen niin ohjelmaa alkaa tulostaa loputtomasti "Anna luku" tekstiä

    Äänestä

  • juussto kirjoitti:

    koodissa kutsun funktiota seuraavasti:

    int luku;
    while((luku = kysyLuku())==-1);

    ja funktio kysyLuku():

    int kysyLuku()
    {
    int luku=0;

    printf("Anna luku\n");
    if(0==(scanf("%d", &luku)))
    {   
    fprintf(stderr, "VIRHE!\n", "");
             
    return -1;
    }

    return luku;
    }


    niin jos syöttää vaikka kirjaimen niin ohjelmaa alkaa tulostaa loputtomasti "Anna luku" tekstiä

    Virheenkäsittely taitaa vain vähän bugittaa. Kirjoitettaessa vaikka kirjain scanf ei saa luettua numeroa, joten scanf palauttaa nollan. Tämä onkin tarkistettu oikein, mutta ongelma on siinä, että kirjain jää luettavaksi vielä seuraavallakin kutsulla kysyLukuun. Tämän takia aiheutuu ikilooppi. Lisäksi kannattaa tarkistaa myös syötteen loppuminen. Pikavilkaisulla annettu esimerkkikoodi ei taida toimia oikein luvulla -1.

    Tarvitaan siis tapa ohittaa virheellinen syöte. Yksi ratkaisutapa tässä tapauksessa on vaikkapa lukea syötettä toistuvasti merkki kerrallaan, kunnes scanf palauttaa jotain järkevää. Homma onnistunee vaikka fgetc:llä, getc:llä, getchar:lla tai jollain vastaavalla.

    Äänestä

  • Mik kirjoitti:

    Virheenkäsittely taitaa vain vähän bugittaa. Kirjoitettaessa vaikka kirjain scanf ei saa luettua numeroa, joten scanf palauttaa nollan. Tämä onkin tarkistettu oikein, mutta ongelma on siinä, että kirjain jää luettavaksi vielä seuraavallakin kutsulla kysyLukuun. Tämän takia aiheutuu ikilooppi. Lisäksi kannattaa tarkistaa myös syötteen loppuminen. Pikavilkaisulla annettu esimerkkikoodi ei taida toimia oikein luvulla -1.

    Tarvitaan siis tapa ohittaa virheellinen syöte. Yksi ratkaisutapa tässä tapauksessa on vaikkapa lukea syötettä toistuvasti merkki kerrallaan, kunnes scanf palauttaa jotain järkevää. Homma onnistunee vaikka fgetc:llä, getc:llä, getchar:lla tai jollain vastaavalla.

    Ei näitä syötteitä kannata scanf:illa vastaanottaa muuten kuin jossakin testiohjelmassa. Scanf on altis kaikille "käyttäjän virheille" mitä kuvitella saattaa.

    Oikea työkalu on getchar. Se on hankalampi käyttää kun mm. BackSpacen joutuu toteuttamaan itse. Mutta kun kerran tekee tarkoitukseen sopivan funktion, sillä pärjää kaikissa tilanteissa.

    for(;;)
    {
      switch(getchar())
      {
        case ...
      }
    }

    Äänestä

  • Sinivuokko kirjoitti:

    Ei näitä syötteitä kannata scanf:illa vastaanottaa muuten kuin jossakin testiohjelmassa. Scanf on altis kaikille "käyttäjän virheille" mitä kuvitella saattaa.

    Oikea työkalu on getchar. Se on hankalampi käyttää kun mm. BackSpacen joutuu toteuttamaan itse. Mutta kun kerran tekee tarkoitukseen sopivan funktion, sillä pärjää kaikissa tilanteissa.

    for(;;)
    {
      switch(getchar())
      {
        case ...
      }
    }

    "Oikea työkalu on getchar."

    Höpö höpö. Jokaista pientä testiohjelmaakin varten kannattaa tietenkin tehdä oma näppishandleri! Koukutetaan keskeytys 0x09, joka lukee näppistä portista 0x60. Tämän toteuttaminen DJGPP:llä on varsin helppoa (esimerkkikoodi Lamertutista):

    int setkeyhandler() {
    int c;
    for(c=0; c

    Äänestä

Kommentoi aloitusta


juussto kirjoitti:

mikä on c-kielen kätevin tapa tarkistaa että syöte on haluttua muotoa. Esim ohjelmani vaatii syötteeksi pelkkiä numeroita. Kiitos

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