Kysyn ohjelmassani käyttäjältä ensi integeriä cinillä, jonka jälkeen kysyn hjäneltä stringiin täytettä getlinellä. Eli siis tarvitsen kokonaisen lauseen välilyönteineen. Tämän jälkeen kysyn käyttäjältä taas integeriä cinillä.
Tämä aiheuttaa epämääräisiä ongelmia, kuten esim yhden syötteen ylihyppäämistä kokonaan ja ikuiseen silmukkaan joutumista. Osaatteko antaa neuvoja, kuinka pystyn käyttämään molemapia samassa koodissa?
int luku, luku2; string lause; cout << "Kirjoita jokin kokonaisluku: "; cin >> luku; cout << "Kirjoita jokin lause: "; getline(cin, lause); cout << "Kirjoita taas jokin kokonaisluku: "; cin >> luku2;
getline jättää syötteeseen enterin lukematta, joten sinun pitää tyhjentää syöte ennen seuraavaa lukemista. Yksi vaihtoehto on käyttää std::cin.ignore, jonka jälkeen jatketaan normaalin tapaan.
#include <iostream> #include <limits> int main(int argc, char** argv) { int luku, luku2; std::string lause; std::cout << "Kirjoita jokin kokonaisluku: " << std::endl; std::cin >> luku; std::cout << "Kirjoita jokin lause: " << std::endl; std::getline(std::cin, lause); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Kirjoita taas jokin kokonaisluku: " << std::endl; std::cin >> luku2; return 0; }
Teuro kirjoitti:
getline jättää syötteeseen enterin lukematta
Melkein!
Luvun lukeminen jättää enterin lukematta. Tämä on sikäli loogista, että kun pyydetään yksi luku, ei tarvitse lukea sen enempää. Seuraava getline lukee loppuun sen rivin, jolla edellinen luku oli. Rivinvaihdon ohitus tarvitaan siis ennen getline-riviä.
#include<iostream> using namespace std; int main() { int luku, luku2; string lause; cout << "Kirjoita jokin kokonaisluku: "; cin >> luku; cout << "Kirjoita jokin lause: "; cin.ignore(); getline(cin, lause); cout << "Kirjoita taas jokin kokonaisluku: "; cin >> luku2; return 0; }
Muutin koodini tällä tavalla ja näyttäisi toimivan ilman ihmeellisiä erroreja.
Tuossa ignore ohittaa yhden merkin, joka on siis rivinvaihto, ellei luvun perässä satu olemaan jotain muuta tekstiä. Siis ehkä toimii, ehkä ei toimi.
Yksi mahdollisuus olisi myös cin >> ws, joka lukee kaikki tyhjät pois. Silloin voi naputtaa useammankin enterin, ja getline alkaa vasta, kun tulee taas tekstiä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.