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
struct Arvot
[ char pv [5];
}
niin voiko tätä luettaessa käyttää
while (pv>0||pv
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!
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.
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
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.
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....
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);
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ä.