Próbuję uzyskać kilka parametrów wejściowych użytkownika z konsoli, dwa ciągi, dwa numery int i podwójne. Odpowiedni kod Próbuję użyć to:C++ getline() nie czeka na dane wejściowe z konsoli, gdy jest wywoływana wiele razy
#include <string>
#include <iostream>
using namespace std;
// ...
string inputString;
unsigned int inputUInt;
double inputDouble;
// ...
cout << "Title: ";
getline(cin, inputString);
tempDVD.setTitle(inputString);
cout << "Category: ";
getline(cin, inputString);
tempDVD.setCategory(inputString);
cout << "Duration (minutes): ";
cin >> inputUInt;
tempDVD.setDuration(inputUInt);
cout << "Year: ";
cin >> inputUInt;
tempDVD.setYear(inputUInt);
cout << "Price: $";
cin >> inputDouble;
tempDVD.setPrice(inputDouble);
Jednak po uruchomieniu programu, zamiast czekać na pierwszy inputString należy wprowadzić kod nie zatrzymać aż do drugiej getline() wezwanie . Zatem wyjście konsola wygląda następująco:
Tytuł Kategoria:
pomocą kursora pojawiającego się po kategorii. Jeśli teraz wprowadzę, program przeskoczy do przodu na rok, nie pozwalając mi wprowadzić więcej niż jednego ciągu znaków. Co tu się dzieje?
nie można odtworzyć; proszę zamieścić prawdziwy, pełny kod. Założę się, że twój problem leży gdzie indziej. Nie mieszaj również sformatowanych danych wejściowych z 'getline()'. –
@KerrekSB: Zgadzam się, że ich mieszanie jest symptomem złego stylu, ale jaki jest obiektywny powód, dla którego ich nie mieszasz? Myślę, że to naprawdę ważne, żeby je wymieszać. – sehe
@sehe: Problem polega na tym, że sformatowane wyodrębnianie nie pochłania nowych linii, więc bardzo łatwo uzyskać nieoczekiwane wyniki, gdy wykonasz 'getline()' po tym, jak już przetworzyłeś całą poprzednią linię. Nie mówię, że to niemożliwe, ale często sprawia, że logika jest trudna do odczytania i utrzymania. –