Hei,
Tarkoitus olisi tehdä yksinkertainen ohjelma, jossa käyttäjältä kysytään yksi luku. Homma on muuten hanskassa, mutta miten voin tarkistaa onko syötetty luku varmasti luku eikä esim. kirjain?
Voit käyttää standardikirjastojen valmiita funktioita (ctype.h:sta esim. isalpha), tai sitten vertailemalla syötetyn merkin ASCII-arvoja numeroihin. Hyvä ASCII-taulukko löytyy osoitteesta http://www.lookuptables.com.
Vertailu tapahtuu näin:
/* (int) ei taida olla pakollinen, mutta minä käytän sitä tällaisissa tapauksissa. */ if ((int)c>47&&(int)c<58) printf("Se on numero!\n");
Tässä muuttuja c on tietenkin syötteenä annettu merkki.
Lukuahan siinä kysyttiin eikä yhtä numeroa. (Ja tuohonkin olisi varmempana isdigit-funktio, ettei tarvitsisi itse ASCII-koodeilla tapella.)
if (scanf("%d", &i) == 1) { printf("Yksi juttu saatiin luettua: %d\n", i); } else { printf("Ei saatu luettua yhtä juttua, eli se ei sitten ollut luku.\n"); }
Äh juu, hitsit. Luin väärin. Siis LUKU ei numero. :)
Metabolix kirjoitti:
Lukuahan siinä kysyttiin eikä yhtä numeroa. (Ja tuohonkin olisi varmempana isdigit-funktio, ettei tarvitsisi itse ASCII-koodeilla tapella.)
if (scanf("%d", &i) == 1) { printf("Yksi juttu saatiin luettua: %d\n", i); } else { printf("Ei saatu luettua yhtä juttua, eli se ei sitten ollut luku.\n"); }
Kiitos! Tämä tuntuu toimivan :) yhden probleeman huomasin: Jos käyttäjä antaa antaa vaikka tälläisen jonon 12aadad, niin ohjelma palauttaa 12. haluaisin, että jos käyttäjän syöttämä jono sisältää pelkkiä lukuja se hyväksytään... Onko ideoita?
No pienellä muokkauksella. Lue koko merkkijono, jos löytyy jotain muita kuin numeroita, kysy uudestaan lukua. Tähän voi myös soveltaa tuota minun vahinko-esimerkkiäni. :)
Metabolix kirjoitti:
Lukuahan siinä kysyttiin eikä yhtä numeroa. (Ja tuohonkin olisi varmempana isdigit-funktio, ettei tarvitsisi itse ASCII-koodeilla tapella.)
Onko ASCII-koodien käsittelemisessä jotain haittaa, jonka perusteella isdigittiä kannattaisi käyttää?
Esimerkiksi se Blazen joskus muinoin esittämä teoreettinen mahdollisuus, että käyttäjän merkistö ei noudattaisikaan ASCII-koodeja. Sitähän ei missään varsinaisesti taata. :)
Mutta siis,
if (scanf("%d", &i) != 1 || !isspace(fgetc(stdin))) { // Ei ollut luku, tai oli luvun perässä muuta kuin väli, enter tms. }
Eli siitä on haittaa vain, jos ASCII-koodit eivät ole käytössä ? :p
Mites sitten isdigit, isalpha ynm. -funktiot toimivat?
isdigit
, isalpha
ja kaverit toimivat muissakin kuin ascii-merkistöissä. Funktiot ottavat käyttäjän lokaaliasetuksenkin huomioon (ks. setlocale
), joten homman pitäisi toimia öökkösilläkin. Eri merkistöissä öökköset saattavat vielä olla eri koodeilla, joten siinä meni sitten se ikiomatekemä kooditaulukko. Ja vaikka numeromerkit ovat ei-niin-sattumalta peräkkäin kaikissa merkistöissä, ne ovat eri koodeilla esmes ascii- ja ebcdic-merkistöissä.
Ah, kiva kun kerroit. Nyt olen viisaampi :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.