getline nie działa prawidłowo? Jakie mogą być przyczyny? [duplikat]

Możliwy duplikat:
getline nie pyta o wejście?

W moim programie dzieje się coś wyjątkowego. Oto kilka komend:
 cout << "Enter the full name of student: ";  // cin name
 getline( cin , fullName );

 cout << "\nAge: ";  // cin age
 int age;
 cin >> age ;

cout << "\nFather's Name: ";  // cin father name
getline( cin , fatherName );

cout << "\nPermanent Address: ";  // cin permanent address
getline( cin , permanentAddress );
Kiedy próbuję uruchomić ten fragment wraz z całym kodem.Program wyjściowy działa tak:

Tutaj wpisz opis obrazka

Wyjście:

Enter the full name of student:
Age: 20

Father's Name:
Permanent Address: xyz

Jeśli zauważysz, program nie pytał mnie o pełne imię i poszedł bezpośrednio zapytać mnie o wiek.Wtedy też pomija imię Ojca i pyta o stały adres. Jaki może być tego powód ?

Trudno mi opublikować cały kod, ponieważ jest zbyt duży.

Author: Community, 2011-07-11

3 answers

Ponieważ nie opublikowałeś żadnego kodu. Zgadnę.

Częstym problemem podczas używania getline z cin jest getline nie ignoruje wiodących białych znaków.

Jeśli getline jest używany po cin >>, getline() widzi ten znak nowej linii jako wiodącą białą spację i po prostu przestaje czytać dalej.

Jak to rozwiązać?

Zadzwoń cin.ignore() zanim zadzwonisz getline()

Lub

Wykonaj fałszywy telefon getline(), aby skonsumować trailing znak nowej linii z cin >>

 46
Author: Alok Save,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-11 12:19:53

Problem polega na tym, że mieszasz getline z cin >> wejściami.

Kiedy robisz cin >> age;, to pobiera wiek ze strumienia wejściowego, ale pozostawia białe spacje na strumieniu. W szczególności, pozostawi nowy wiersz w strumieniu wejściowym, który zostanie odczytany przez następne wywołanie getline jako pusty wiersz.

Rozwiązaniem jest użycie tylko getline do pobierania danych wejściowych, a następnie parsowanie linii w celu uzyskania potrzebnych informacji.

Lub aby naprawić Kod, możesz wykonać następujące czynności np. (you ' ll still trzeba samemu dodać kod sprawdzający błąd):

cout << "Enter the full name of student: ";  // cin name
getline( cin , fullName );

cout << "\nAge: ";  // cin age
int age;
{
    std::string line;
    getline(cin, line);
    std::istringstream ss(line);
    ss >> age;
}

cout << "\nFather's Name: ";  // cin father name
getline( cin , fatherName );

cout << "\nPermanent Address: ";  // cin permanent address
getline( cin , permanentAddress );
 3
Author: Sander De Dycker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-11 12:14:43

Po linii cin >> age ; nadal znajduje się znak nowej linii \n (ponieważ nacisnąłeś enter, aby wprowadzić wartość) w buforze wejściowym, aby to naprawić, dodajesz linię z cin.ignore(); po odczytaniu int.

 1
Author: lccarrasco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-11 12:14:36