Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: cin ja getline samassa koodissa

SukaBljat [17.12.2017 17:12:04]

#

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;

Teuro [17.12.2017 17:26:41]

#

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;
}

Metabolix [17.12.2017 18:37:30]

#

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ä.

SukaBljat [17.12.2017 18:47:40]

#

#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.

Metabolix [17.12.2017 19:12:32]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta