taulukkoon luku/tietuetyypit

ihmettelen, miten kun on struct tietuetyyppinä char ja olisi taulukkoon tarkoitus lukea päivämäärä

struct Arvot
[ char pv [5];
}

niin voiko tätä luettaessa käyttää
while (pv>0||pv
11767
Äänestä

Muut lukivat myös

Vastaukset 11

Vanhimmat

Et pysty vertaamaan char-tyyppiä kokonaislukuun. Käsittääkseni sinun tarkoituksena olisi tarkoitus tallettaa päivämäärä muodossa pp.kk, missä pp ja kk ovat kokonaislukuja. Sitten pyydät käyttäjältä päivän ja kuukauden sopivilla tarkistuksilla.

Toinen mahdollisuus on pyytää käyttäjältä se suoraan muodossa pp.kk ja käyttää esim StringTokenizer:ia tarkisteluun!

Äänestä
  • Eikös char ole kokonaisluku väliltä -127...128.

    Ja eikös StringTokenizer kuuluu Javaan.

    Äänestä

  • NitPicker kirjoitti:

    Eikös char ole kokonaisluku väliltä -127...128.

    Ja eikös StringTokenizer kuuluu Javaan.

    signed char saa arvot -128..127 ja unsigned char vastaavasti 0..255.

    Äänestä

  • Mik kirjoitti:

    signed char saa arvot -128..127 ja unsigned char vastaavasti 0..255.

    jos laitan pv ja kk erikseen int ja luen taulukkoon scanf (tosin en oo varma muodosta, miten), niin silti tuo vertailu ei onnistu. Jos laitan

    while (pv>1||pv1&&pv

    Äänestä

  • Mik kirjoitti:

    signed char saa arvot -128..127 ja unsigned char vastaavasti 0..255.

    Pointti oli lähinnä se kun tuo edellinen sanoi: "Et pysty vertaamaan char-tyyppiä kokonaislukuun."
    Niin ei taida ihan tuossa muodossa tuo väite pitää paikkaansa.

    Äänestä

  • opiskelija kirjoitti:

    jos laitan pv ja kk erikseen int ja luen taulukkoon scanf (tosin en oo varma muodosta, miten), niin silti tuo vertailu ei onnistu. Jos laitan

    while (pv>1||pv1&&pv

    Siis olet scanf:llä lukenut muuttujaan pv päivämäärän ja haluat tarkistaa että se on validi ts. väliltä 1-31. Tuo onnistuu esim vertailulla (loopissa)

    while(pv31);

    Äänestä

  • NitPicker kirjoitti:

    Siis olet scanf:llä lukenut muuttujaan pv päivämäärän ja haluat tarkistaa että se on validi ts. väliltä 1-31. Tuo onnistuu esim vertailulla (loopissa)

    while(pv31);

    sillä toi while lauseke ei toimi... taidan lyödä hanskat tiskiin :-(

    ehkä mä olen laittanut sen taulukkomäärittelyn ja struct tietueet väärin, who knows....

    Äänestä

  • NitPicker kirjoitti:

    Siis olet scanf:llä lukenut muuttujaan pv päivämäärän ja haluat tarkistaa että se on validi ts. väliltä 1-31. Tuo onnistuu esim vertailulla (loopissa)

    while(pv31);

    Ei ihmekään, jos tuo ei toimi. while jää ikilooppiin, jos tuo ehto on kerrankin totta. Huomaa siis, että ehdon ollessa tuossa totta suoritetaan , joka ei lopu milloinkaan (koska pv:n arvo ei muutu).

    Kokeile jotain tyyliin (en kokeillut tätä käytännössä):

    int ret;
    int pv = 0;

    while (1) {
    ret = scanf("%d", &pv);
    if (ret != 1) /* scanf ei saanut luettua mitään */
    break;
    if (pv < 1 || pv > 31)
    printf("virheellinen pv-luku\n");
    else
    break;
    }

    /* tarkistetaan vielä, että scanf sai luettua arvon oikein poistuttaessa while-loopista */
    if (ret != 1) {
    printf("ei saatu luettua päivää\n");
    /* muu virheenkäsittely... */
    }

    Äänestä

  • Mik kirjoitti:

    Ei ihmekään, jos tuo ei toimi. while jää ikilooppiin, jos tuo ehto on kerrankin totta. Huomaa siis, että ehdon ollessa tuossa totta suoritetaan , joka ei lopu milloinkaan (koska pv:n arvo ei muutu).

    Kokeile jotain tyyliin (en kokeillut tätä käytännössä):

    int ret;
    int pv = 0;

    while (1) {
    ret = scanf("%d", &pv);
    if (ret != 1) /* scanf ei saanut luettua mitään */
    break;
    if (pv < 1 || pv > 31)
    printf("virheellinen pv-luku\n");
    else
    break;
    }

    /* tarkistetaan vielä, että scanf sai luettua arvon oikein poistuttaessa while-loopista */
    if (ret != 1) {
    printf("ei saatu luettua päivää\n");
    /* muu virheenkäsittely... */
    }

    Miksi näin:

    while (1) {
    ret = scanf("%d", &pv);
    if (ret != 1) /* scanf ei saanut luettua mitään */
    break;
    if (pv < 1 || pv > 31)
    printf("virheellinen pv-luku\n");
    else
    break;
    }

    Miksei suoraan näin:

    pv=0;
    do {
    if(scanf("%d",&pv)!=1)break;
    }while(pv31);

    Äänestä

  • NitPicker kirjoitti:

    Miksi näin:

    while (1) {
    ret = scanf("%d", &pv);
    if (ret != 1) /* scanf ei saanut luettua mitään */
    break;
    if (pv < 1 || pv > 31)
    printf("virheellinen pv-luku\n");
    else
    break;
    }

    Miksei suoraan näin:

    pv=0;
    do {
    if(scanf("%d",&pv)!=1)break;
    }while(pv31);

    Tyyli- tai optimointiseikkahan tuo on. scanf:n paluuarvon laitoin omaan muuttujaan, koska muuttujaa on helpompi debugata debuggerin kanssa leikkiessä.

    Eikö tuossa alemmassa käy niin, että jos scanf lukee heti yhden arvon, do-loopista poistutaan välittömästi ja pv:n arvo on loopin ulkopuolella 0 ?

    Äänestä

  • Mik kirjoitti:

    Tyyli- tai optimointiseikkahan tuo on. scanf:n paluuarvon laitoin omaan muuttujaan, koska muuttujaa on helpompi debugata debuggerin kanssa leikkiessä.

    Eikö tuossa alemmassa käy niin, että jos scanf lukee heti yhden arvon, do-loopista poistutaan välittömästi ja pv:n arvo on loopin ulkopuolella 0 ?

    Niin siis jos syöte on virheellinen esim. tekstiä pv:n arvo on 0, mutta jos se on väliltä 1-31 niin pv sisältää sen ja luuppi loppuu välittömästi. Eikös tuota alunperin kait haettukin että miten saa tuollaisen syötteen kyselyn joka hyväksyy vain tuolta väliltä.

    Äänestä

Kommentoi aloitusta


opiskelija kirjoitti:

ihmettelen, miten kun on struct tietuetyyppinä char ja olisi taulukkoon tarkoitus lukea päivämäärä

struct Arvot
[ char pv [5];
}

niin voiko tätä luettaessa käyttää
while (pv>0||pv

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