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

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

14.02.2017, 19:16. Показов 694. Ответов 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 - то проблем нет, но тут я так понимаю смысл в объектном вводе - объект кончился, поток пустой (?), а вот с буферами/потоками и символами, что там остаются - я прочитал все описания функций, разъяснения, но никак не могу догнать принцип, ни на английском, ни на русском. У Шилдта и Прата тоже все легко описано теорией, а смысл никак не ложиться.
Миниатюры
Опять про cin.getline и невызов  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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); Name = new char; strcpy(Name,...

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

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

5
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
14.02.2017, 19:53
Цитата Сообщение от 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  [ТС]
а почему тогда оставив cin.get() в конце первого ввода, потом все работает нормально, но при этом сама функция не вызвается? Она, получается, вызывается, "поглощает" оставшийся после cin "\n"?

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

p.p.s. а есть ли возможность, как дебуггером, например, отследить что происходит с буфером ввода и как считывается ввод? Так будет очень легко понять все эти вариации getов
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
15.02.2017, 18:57
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
В конце первого ввода - это где? cin.get() убирает '\n' из потока, остающийся там после cin >> age.
да, я неправильно выразился, имелось в виду, что если добавить cin.get() в конце блока, то при вызове второй раз, все пройдет нормально, т.к. гет уберет символ новой строки из потока.

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

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

Добавлено через 51 секунду
Цитата Сообщение от badvik Посмотреть сообщение
Хотелось бы понять, почему.
Создай тему.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2017, 19:31
Помогаю со студенческими работами здесь

Объясните работу методов cin.getline и cin.ignore
Фрагмент программы ниже. Что делают cin.getline и cin.ignore (12-13 строки) void WorkWithBooks(int Books) { if (Books &gt; 0) ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru