mikä on c-kielen kätevin tapa tarkistaa että syöte on haluttua muotoa. Esim ohjelmani vaatii syötteeksi pelkkiä numeroita. Kiitos
c-kieli syötteen tarkastaminen
juussto
81223
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
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.
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.
Lisää siihen vielä sydeemi, jolla esc painallus keskeyttää ohjelman.
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.
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