Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
1

Опять про cin.getline и невызов

14.02.2017, 19:16. Показов 443. Ответов 5
Метки нет (Все метки)

я знаю, что вопрос много раз поднимался, но везде ссылки или описания типа делай так и все - это я читал... Вот фрагмент кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
...
baby1.setData();
baby2.setData();
...
 
void Children::setData() {
    cout << "Input name: ";
    cin.getline(name, 10);  
    cout << "Input family: ";
    cin.getline(family, 20);
    cout << "Input age: ";  
    cin >> age;     
}
собственно, baby1 проходит нормально, а вот с baby2 cin.getline(name, 10); уже не вызывается (принт приложил).
И почему, если добавить в конце после cin >> age - cin.get(); то все вызывается нормально?
2. Сюда же, cin.ignore(); - все тоже работает, а вот cin.sync() - нет. Почему? Ведь после предыдущего getline остается \n?

p.s. и поправьте - если все cin - то проблем нет, но тут я так понимаю смысл в объектном вводе - объект кончился, поток пустой (?), а вот с буферами/потоками и символами, что там остаются - я прочитал все описания функций, разъяснения, но никак не могу догнать принцип, ни на английском, ни на русском. У Шилдта и Прата тоже все легко описано теорией, а смысл никак не ложиться.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Опять про cin.getline и невызов  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2017, 19:16
Ответы с готовыми решениями:

Вопрос про cin.getline()
char mas; cout&lt;&lt;&quot;Add Age &quot;; cin&gt;&gt;Age; cout&lt;&lt;&quot;Add Name &quot;; cin.getline(mas,20);...

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по коду есть...

Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами
Нужна помощь. Задача продемонстрировать различие между вводом с помощью cin.get и cin.getline с...

Объясните работу методов cin.getline и cin.ignore
Фрагмент программы ниже. Что делают cin.getline и cin.ignore (12-13 строки) void...

5
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
14.02.2017, 19:53 2
Цитата Сообщение от badvik Посмотреть сообщение
а вот cin.sync() - нет. Почему?
Потому, что этот способ не везде работает.
Цитата Сообщение от badvik Посмотреть сообщение
Ведь после предыдущего getline остается \n?
После getline() '\n' не остаётся.
http://www.cplusplus.com/refer... m/getline/
Цитата Сообщение от badvik Посмотреть сообщение
но никак не могу догнать принцип,
Вот здесь:
Цитата Сообщение от badvik Посмотреть сообщение
cin >> age;
в потоке ввода остаётся '\n', который, для следующих getline() (при вызове baby2.setData()), будет пустой строкой, поэтому будет пропускаться ввод. Вот и весь принцип.
Распространенные ошибки
1
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
15.02.2017, 18:50  [ТС] 3
а почему тогда оставив cin.get() в конце первого ввода, потом все работает нормально, но при этом сама функция не вызвается? Она, получается, вызывается, "поглощает" оставшийся после cin "\n"?

p.s. по ссылке один из вариантов как раз cin.sync(), сбрасывает остаток строки, почему тогда в моем фрагменте он не работает?

p.p.s. а есть ли возможность, как дебуггером, например, отследить что происходит с буфером ввода и как считывается ввод? Так будет очень легко понять все эти вариации getов
0
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.02.2017, 18:57 4
Цитата Сообщение от badvik Посмотреть сообщение
а почему тогда оставив cin.get() в конце первого ввода, потом все работает нормально,
В конце первого ввода - это где? cin.get() убирает '\n' из потока, остающийся там после cin >> age.
Цитата Сообщение от badvik Посмотреть сообщение
но при этом сама функция не вызвается?
Где и что не вызывается?
Цитата Сообщение от badvik Посмотреть сообщение
p.s. по ссылке один из вариантов как раз cin.sync(), сбрасывает остаток строки, почему тогда в моем фрагменте он не работает?
Написал уже:
Цитата Сообщение от nd2 Посмотреть сообщение
Потому, что этот способ не везде работает.
0
3 / 3 / 0
Регистрация: 15.10.2015
Сообщений: 60
15.02.2017, 19:19  [ТС] 5
Цитата Сообщение от nd2 Посмотреть сообщение
В конце первого ввода - это где? cin.get() убирает '\n' из потока, остающийся там после cin >> age.
да, я неправильно выразился, имелось в виду, что если добавить cin.get() в конце блока, то при вызове второй раз, все пройдет нормально, т.к. гет уберет символ новой строки из потока.

Цитата Сообщение от nd2 Посмотреть сообщение
Где и что не вызывается?
Тоже не по-русски написал, прошу прощения - функция cin.get() вызвается, но пользователь это не видит и ничего не вводит, т.к. она вызывается, сама же поглощает '\n' и заканчивает работу. Правильно я понимаю?

Цитата Сообщение от nd2 Посмотреть сообщение
Написал уже:
я видел, спасибо. Хотелось бы понять, почему.
0
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.02.2017, 19:31 6
Цитата Сообщение от badvik Посмотреть сообщение
Правильно я понимаю?
Правильно.

Добавлено через 51 секунду
Цитата Сообщение от badvik Посмотреть сообщение
Хотелось бы понять, почему.
Создай тему.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2017, 19:31

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Отличие функции cin.get и cin.getline
Добрый день! Изучаю функции get и getline, сказано, что они отличаются тем, что функция get...

Отличие getline() от cin.getline()
Чем отличается getline() от cin.getline() ?

cin.getline и cin.ignore
Есть кусок кода в котором не могу разобраться. Если cin.ignore() есть, то теряется первый вводимый...

Не работает ни cin.Get(), ни cin.Getline()
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;windows.h&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.