Niewywołanie 'cin.getline' po 'cin'

0

Po pierwsze, witam wszystkich ponieważ jest to mój pierwszy post na forum :)
Wiele razy znajdowałem tutaj rozwiązania swoich problemów, ale tym razem nie mam pojęcia o co chodzi, więc mam nadzieję że pomożecie :)

Ale do rzeczy, napisałem funkcję, która sczytuje dowolną ilość par liczb, z tablicy char-ów, do której wpisuje się je jedna po drugiej, oddzielone spacją. Problem polega na tym, że kiedy wczytam sobie ilość tych par za pomocą cin, pierwsze wywołanie funkcji cin.getline w pętli zachowuje się tak, jakbym od razu wcisnął enter, czyli nie mogę nic wpisać. W momencie kiedy liczbę przypadków ustalam z góry (np. cases = 2;), problem znika i wszystko działa jak powinno.

 
void disp(void) {
	int cases;
	cout << "Podaj liczbę przedzialow: ";
	cin >> cases;
	array2d *przedzialy = new array2d(cases, 2);

	char tab[22];

	for(int i=0 ; i<cases ; i++) {
		cout << "Podaj pare liczb: ";
		cin.getline(tab, 22);
		cout << endl;
		przedzialy->array[i] = (double*) char2num(tab, 2);
		cout << endl;
	}
	cout << endl;

	delete przedzialy;
}

Będę wdzięczny za wszelką pomoc :)

0

wywołaj cin.sync(); po getline.

0

Tak na szybko mogę ci podpowiedzieć żebyś popróbował np:

cout << "Podaj pare liczb: ";
std::cin.clear()
std::cin.ignore(100, '\n');
cin.getline(tab, 22);
cout << endl;

Moze zadziala, moze nie :/.

Zastrzegam sobie ze prawo do błędu xD;
generalnie nie chce mi sie czytać kodu;
nie wiem czy moje rozwiązanie jest przypadkiem pogwałceniem wszystkich zasad programowania.

0

pfu, oczywiście przed getline najlepiej dla pewności jeszcze cin.ignore(numeric_limits<streamsize>::max(), '\n');

0

Ogólnie cin >> zmienna wczytuje dane do znaku białego (' ', '\t','\n' itd.) zostawiając go na wejściu. Więc jeżeli jeżeli wczytujesz coś za pomocą takiej procedury to zostają ci białe znaki na końcu, np '\n'. Wywołanie wtedy "członka" getline powoduje wczytanie wejścia do znaku końca linii, nawet jak to będzie następnym znakiem. Dlatego trzeba stosować metody opisane powyżej.

0

Zadziałało po takiej poprawce:

 
cout << "Podaj liczbę przedzialow: ";
cin >> cases;
cin.ignore(100, '\n');

Po tym naprowadzeniu znalazłem trochę więcej informacji na ten temat i rozumiem, że po prostu zatwierdzenie enterem zostaje w strumieniu i jest automatycznie wczytywane jako pierwszy znak przez cin.getline. Domyślam się też że argument 100 jest po prostu na wszelki wypadek.
W każdym razie dzięki za szybką pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1