Loading...
JOHNY avatar JOHNY 196 Точки

Проблеми с getline в Домашно от "Упражнение цикли 2", задача 2 - Exam Preparation

Здравейте,
За пореден път имам проблеми при използване на getline(cin,string);, като вместо в конзолата да чете вход, Visual (а и judge) директно прескачат реда, все едно не съществува.
Ето код от конкретната задача.

На редове 18 и 19 ще видите едно и също, а именно getline(cin, name);, където name е името на съответния пореден урок.

Логично погледнато би трябвало два пъти да се очаква вход при повторение на двата реда. Да, ама не. Така програмата работи и дава 100 точки в judge.

Ако изтрия дублиращият ред всичко отива по дяволите и getline не чете нищо, четат се само числата (оценките по съответния предмет, който getline е трябвало да "хване").

Въпросите са два:
1. Защо се случва това?

2. Кога се случва това и как да се избегне? Личните ми впечатления показват, че се случва при въвеждане поредно чрез getline и cin >>, но нали използваме getline заради проблема на >> с "white spaces" (не може да прочете фраза с интервал в нея, а взима стойността само на низа до интервала)?

Благодаря предварително за помощта. Минаха часове, докато успея да хвана защо всичко се дъни...

 

Тагове:
0
Programming Basics with C++
Filipbg avatar Filipbg 26 Точки

Ако ще смесваш cin с getline, то използвай cin.ignore(). Сложи го преди цикъла и пробвай дали ще тръгне. 

0
JOHNY avatar JOHNY 196 Точки

Ще тръгне при правилен синтаксис.

По-интересно ми е защо върви повторението на getline като един ред, че и присвоява коректно стойност.;)

0
Filipbg avatar Filipbg 26 Точки

Ами незнам условието на задачата, но както гледам имаш 2 стринга за име и фамилия. А викаш getline(cin, name); само. Това name всъщност ти е коя променлива подаваш на getline. То ти взима променливата от cin. С две думи направи 19ти ред на getline(cin, lastname);

А ако имаш в предвит че не съм сложил ; направих го нарочно за да го напиша в изречение.

Ето какво представлява cin.ignore();

http://www.cplusplus.com/reference/istream/istream/ignore/

0
JOHNY avatar JOHNY 196 Точки

Благодаря ти за линка, ползвал съм ignore по необходимост и знам , че си прав и ще работи.

Виж пак кода. Редове 18 и 19 са еднакви и теоретично в конзолата трябва два пъти подред да зададеш стойност на name.  А на практика се случва веднъж и judge грее със сто точки.;)

Тоест, при един getline конзолата "прескача" реда, а при два - въвежда КОРЕКТНО веднъж. 

 

Lastname само помни последно въведеното name и няма работа с конзолата. И тъй като name се променя при всяко повторение на цикъла, задавам на lastname "last known" стойност на name, защото един ден ще трябва да я принтвам. 
 

За това иде реч - некоректното работи коректно, а коректното не работи изобщо.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.