45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
|
||||||
1 | ||||||
Почему с cin отображается корректно, а с gets() нет?15.11.2018, 11:51. Показов 3412. Ответов 20
Метки классы; с++; (Все метки)
Всем доброго времени! Сразу к делу. Такая задача стоит. Я ее решил, но остался вопрос:п почему с cin программа все выводит адекватно, а с gets() нет.
Задача: Определить класс Children, который содержит такие поля (члены класса): закрытые – имя ребенка, фамилию и возраст , публичные – методы ввода данных и отображения их на экран. Объявить два объекта класса, внести данные и показать их. Мое решение:
0
|
15.11.2018, 11:51 | |
Ответы с готовыми решениями:
20
Почему разметка не отображается корректно во фрагменте? Почему при загрузке отображается вариант ВИНДЫ, которой уже нет на диске? Почему в офисе 97 прога заполнения шаблона ворда из файла екселя работает корректно, а в офисе 2000 нет? Считывание чаров из cin происходит не корректно |
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
15.11.2018, 11:57 | 2 |
Потому что это устаревшая и небезопасная функция.
Используй gets_s(), с входными параметрами строковой переменной и количества символов.
1
|
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
|
|
15.11.2018, 12:04 [ТС] | 3 |
Это не ответ. gets() тоже существует и до этого момента работал адекватно. То, что она устаревшая и небезопасная не делает ее неадекватной в плане ее функционала.
Высылаю скрины: 1) с gets(). 2) с cin.
0
|
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
||||||
15.11.2018, 13:45 | 4 | |||||
Делает, на то она и "устаревшая и небезопасная".
А еще после считывания возраста, у тебя в потоке остается завершающий нуль-символ '\0'
1
|
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
15.11.2018, 13:49 | 6 |
Kuzia domovenok, Именно в этом плане и неадекватная
0
|
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
|
||||||
15.11.2018, 14:22 [ТС] | 7 | |||||
То есть gets() у себя в буфере сохраняет все значения и поэтому она с ошибкой выдает мне результат?
А '\0' символ присутствует здесь
Добавлено через 2 минуты Все, увидел где '\0'. Про gets() ответьте, пожалуйста
0
|
15.11.2018, 14:23 | 8 |
Руслан92, успокойся, этот перфекционист придирается к случаям, когда ты вводишь строку длиною в 80 букв.
Тогда да, очевидно gets провалится. Но мы-то понимаем, что конкретно сейчас проблема не в этом и не время гундеть про "безопасность буфера"
1
|
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
|
|
15.11.2018, 14:28 [ТС] | 9 |
Хорошо. Тогда ответьте, почему gets() не работает при вводе второй фамилии?...
Добавлено через 26 секунд И как вы делаете конкретное обращение в чате?)
0
|
15.11.2018, 14:35 | 10 |
Руслан92, gets это функция для чтения строки в широком смысле. - от начала до нажатия Enter
То есть в твоём примере name это "Ruslan Ranzan 26" surname следующая строка а не то что ты подумал
1
|
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
|
|
15.11.2018, 14:48 [ТС] | 11 |
Я Enter после каждого ввода данных нажимаю. И если уж на то пошло, то в "Ruslan Ranzan 26 Dmitry 0" далеко не 80 символов, однако он почему-то завершает строку. Короче муть какая-то...(
0
|
15.11.2018, 14:54 | 12 |
Я о том и говорю, что рано для SuperKir говорить о переполнении и способах избегать его с помощью gets_s - это просто не тот случай.
я смотрю на скриншот - там "Руслан Рязань 26" всё в одну строчку, плюс, ты изначально спросил о различиях getline и cin. Ну вот оно - различие! Getline считывает в строковую переменную всю строку с экрана, а cin лишь до пробела
0
|
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
15.11.2018, 15:25 | 13 |
Kuzia domovenok, Про getline речи вообще не шло, ни сначала, ни в конце.
Про ввод - исходил из скринов, на нем видно, что автор понимает, что вводить нужно до enter (наверное). Здесь не тот случай, но избегать его все же надо. А проблему я озвучил выше - символ переноса после ввода целочисленной переменной чистить надо.
0
|
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
|
|
15.11.2018, 15:26 [ТС] | 14 |
Вы на код посмотрите внимательнее. Там в функции-члене класса прописано выводить все в одну строчку через пробел.
И насчет этого различия я прекрасно понимаю, что cin обрезает строки при наличии в них пробела. Но речь не об этом. Повторяю еще раз, дорогие мои помощники, в функции-члене класса прописано выводить все в одну строчку через пробел. Почему gets(s) во второй итерации работает, а gets(g) не работает, а выдает шляпу какую-то.
0
|
15.11.2018, 15:27 | 15 |
я смотрю на скриншот - там "Руслан Рязань 26" всё в одну строчку, плюс, ты изначально спросил о различиях gets и cin.
Ну вот оно - различие! Gets считывает в строковую переменную всю строку с экрана, а cin лишь до пробела Не по теме: ты прав, поправил
0
|
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
15.11.2018, 15:29 | 16 |
Руслан92, Потому что после первого ввода символ enter перешел во второй элемент массива в поле ИМЯ, ты вводишь имя для следующего, оно переходит в поле ФАМИЛИЯ, а когда вводишь фамилию, происходит "обнуление", т.к. вводимые данные не являются числом. Вот тебе и вывод "Пусто ИМЯ 0"
0
|
15.11.2018, 15:31 | 17 |
а ввод-то тут при чём? cin и cout и gets вообще-то разные вещи. Да , ты можешь вывести несколько строк через << в линию, а вот дать тебе их ввести тебе в gets никто не обещал.
1
|
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
15.11.2018, 15:33 | 18 |
Kuzia domovenok, попробую перевести)
Он говорит, что ты обращаешь внимание на вывод, который у него в одну строку, а его интересует ввод через gets, который он производил через enter
1
|
15.11.2018, 15:35 | 19 |
SuperKir, на вывод я вообще не смотрел, наоборот, увидев его ответ, долго думал, что у него там есть в одну строку в программе в функции-члене класса прописано выводить все в одну строчку через пробел
и лишь не сразу понял, что это вывод. При чём тут вывод?
1
|
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
|
15.11.2018, 15:36 | 20 |
Сообщение было отмечено Руслан92 как решение
Решение
Руслан92, Еще раз говорю, проблема вся в том, что в потоке, после ввода числа (количества лет), остается символ переноса строки \n (выше я немного не так написал, не \0). Т.к. ты его не чистишь, то получается это:
Сделай очистку потока (как например я привел в коде выше через cin.ignore()) и проблема пропадет. На этом откланиваюсь, работа зовет)
1
|
15.11.2018, 15:36 | |
15.11.2018, 15:36 | |
Помогаю со студенческими работами здесь
20
Как работает cin.peek, cin,get, cin.ignore, cin.clear? Не корректно отображается в ie Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |