getline nie działa prawidłowo? Jakie mogą być przyczyny? [duplikat]
W moim programie dzieje się coś wyjątkowego. Oto kilka komend:Możliwy duplikat:
getline nie pyta o wejście?
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:
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.
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 >>
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 );
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.
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