Minulla on void funktio toisen void funktion sisällä.
void huoneenVaraus() { system("cls"); int toiminto1; cout << "Tervetuloa huoneenvaraukseen" << endl; cout << "Jos haluatte yhden hengen huoneen painakaa 1. " << endl; cout << "Jos haluatte kahden hengen huoneen painakaa 2. " << endl; cout << "Jos haluatte takaisin valikkoon painakaa 3. " << endl; cout << "Jos haluatte poistua ohjelmasta painakaa 4. " << endl; cout << "HINNASTO" << endl; cout << "Yhden henkilön huone 100€/yö. " << endl; cout << "Kahden henkilön huone 150€/yö. " << endl; cin >> toiminto1; while(true){ if (toiminto1 == 1) YhdenhengenHuone(); else if (toiminto1 == 2) KahdenhengenHuone(); else if (toiminto1 == 3) main(); else if (toiminto1 == 4) cout << "Näkemiin! "; break; } }
Ja
void YhdenhengenHuone() { string kokonimi, osoite, kaupunki, postinumero; system("cls"); cout << "Kirjoittakaa koko nimenne: " << endl; getline(cin, kokonimi); }
Ideana siis olisi, että tosta ekasta funktiosta "huoneenVaraus()" kutsutaan tätä "YhdenhengenHuone" funktiota jos käyttäjä niin haluaa. Tähän asti ohjelma toimii, mutta kun "YhdenhengenHuone" funktion sisään päästään ja se tulostaa "Kirjoittakaa koko nimenne" hypää tämä funktio takaisin alkuperäiseen "huoneenVaraus()" funktioon ja siinä olevaan looppiin, jolloin en pääse kirjoittamaan kysyttyä nimeä ja koko ohjelma loppuu.
--------------------------
while(true){ if (toiminto1 == 1) YhdenhengenHuone(); else if (toiminto1 == 2) KahdenhengenHuone(); else if (toiminto1 == 3) main(); else if (toiminto1 == 4) cout << "Näkemiin! "; break; }
Eli miten pystyn estämään ettei tuo YhdenhengenHuone() funktio hyppää automaattisesti takaisin tuohon alkuperäiseen funktioon "huoneenVaraus()".
Ongelma johtuu siitä, että kun luet yhden luvun (toiminto1), lukua seuraava rivinvaihto jää vielä lukematta, ja seuraava getline lukee sitten loput kyseisestä rivistä eli käytännössä tyhjän rivin.
Käyttäjä syöttää: 1234<enter> cin >> toiminto1; 1234 getline(cin, kokonimi); <enter>
Ratkaisuun on kolme vaihtoehtoa:
a) Kun luet jotain >>-operaattorilla, lisää sen jälkeen getline (tai cin.ignore), jolla saat ohitettua seuraavan rivinvaihdon.
b) Kun luet kokonaisen rivin, ohita tyhjät rivit. Ennen getline-riviä cin >> ws ohittaa kaiken white-spacen eli rivinvaihdot ja välit; toisaalta tämä ohittaa rajattomasti tyhjiä rivejä, jolloin hämmentynyt käyttäjä voi naputtaa enteriä eikä mitään tapahdu. Vaihtoehtoisesti getline-rivin jälkeen voit tarkistaa, tuliko tyhjä rivi, ja voit lukea sitten vielä uudestaan getlinella; tällöin hallitset paremmin itse lukemista.
c) Käytä getline-funktiota kaikkeen lukemiseen ja muuta tekstit luvuiksi jälkikäteen vaikka stoi-funktiolla. Tämä ratkaisee ongelmat rivinvaihdon kanssa ja lisäksi ne vielä oudommat ongelmat, jos käyttäjä syöttääkin heti ensimmäiselle riville ”1 Petteri”, josta siis valinnaksi tulee ”1” ja nimeksi ” Petteri”.
Kiitos! Laitoin ton cin >> ws; ennen getline-riviä ja nyt näyttäis toimivan! Ei kyllä varmastikkaan tule olemaan viimeinen ongelma tässä miniprojektissa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.