Hei.
Tälläinen oisi ongelma:
cout << "Anna pippelin pituus: ";
cin >> Pituus, '\n';
Jos käyttäjä antaa vastaukseksi esim. 15cm, niin ohjelma kaatuu. Eli miten varmistan että käyttäjä on antanut double arvoisen vastauksen, ja jos ei ole antanu niin tulostan virheilmoituksen ja kysyn uudestaan ?
Lue syöte merkkijonoon. Tee sille tarvittavat tarkistukset ja lopulta muuta sen sisältö haluamaasi muotoon. Käytä string-luokkaa hyväksesi, helpottaa kummasti.
no joo nyt se ei enään kaatuile kun pistin noi stringiksi, mutta ei kyllä ole mitään hajua miten sitten teen tarvittavat tarkistukset ja muutan sisällön.
Näinhän sen voisi tarkistaa onko siinä muita merkkejä kuin numeroita.
for (a = 0; a < strlen(Pituus); a++) { if (Pituus[a] < 48 || pituus[a] > 57) // mennään kysymään uudestaan }
edit: ja atof:lla voi stringin muuttaa doubleksi
Käyt jokaisen merkin läpi ja tarkistat, että niissä on vain sallittuja merkkejä. Jos haluat pitää mahdollisena sen, että luku sisältää desimaaleja, joudut hieman enemmän säätämään.
Jokaisella merkillä on jokin kokonaisluku "tunnisteena". ASCII-taulussa 0...9 ovat peräkkäisiä merkkejä. Nollan ASCII-arvo on 48.
Stringistä saat yhden merkin tietoosi näin: merkkijono[indeksi];
Koko string voidaan käydä läpi forin avulla näin:
string merkkijono = ""; cin >> merkkijono; // Tehdään niin kauan, kunnes i on suurempi kuin // merkkijonon pituus. Jos kohdataan muu kuin 0-9 // merkki, lopetetaan virheilmoituksen kera. for(int i = 0; i < merkkijono.size()-1; i++) { if(merkkijono[i] < '0' || merkkijono[i] > '9') { cout << "Syöttämäsi merkkijono ei ole kelvollinen. Anna uusi."; break; } }
Jos merkkijono oli kelvollinen, muunnat sen kokonais-/liukuluvuksi. Tämäkin taas vaatii oman säätämisensä. Jos desimaaliluvut ovat mahdollisia, tarkistat, onko merkkijonosso pilkkua/pistettä. Jos on, lasket monta lukua on pisteen oikealla ja monta pisteen vasemmalla puolella. Tämän jälkeen looppiin ja käytetään kymmenpotenssia hyväksi.
Kiitos.
Yksi helppo tapa on käyttää try...catch -blokkia:
std::string sInput; double dPituus; cin >> sInput; try { dPituus = atof(sInput); } catch(...) { // virheenkäsittely tänne }
Eli jos konvertointi atof():llä onnistuu, kaikki hyvin. Jos ei, käsitellään tapaus catch(...):n sisällä.
Voipi olla että muutosrivi pitää olla muotoa:
atof(sInput.c_str());
(ei jaksa sorvata kääntäjää päälle ja testata...)
yksi tapa olisi lukea syöte merkkijonoon ja kaivaa pituus sieltä sscanf-functiolla esim seuraavasti.
#include <string.h> //... int pituus; char syote[255]; cout << "Anna pippelin pituus:\n"; cin >> syote; sscanf(syote,"%i",&pituus); cout << "Pippelin pituus on " << pituus;
Aihe on jo aika vanha, joten et voi enää vastata siihen.