Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.97
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
#1

getline и превышение второго параметра... - C++

25.04.2009, 18:55. Просмотров 3598. Ответов 14
Метки нет (Все метки)

Доброго времени суток, форумчане!
Ничего не могу понять, что происходит, когда превышается второй параметр в cin.getline!
Например, если в следующем фрагменте:
C++
1
2
3
4
5
6
7
char s1[5];
char next[26];
cin.getline(s1,5);
for (int i = 0; i <= 25; i++)
    {
    next[i]=cin.get();
    }
Вводишь 12345, в массиве s1="1234" , а все следующие cin.get() возвращают 'я' !
Причем если заменяешь цикл на еще несколько cin.getline, то все они работают вхолостую!
Ничего не понимаю...((
То есть в потоке ввода содержится 25 я подряд?? К чему бы вдруг??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2009, 18:55     getline и превышение второго параметра...
Посмотрите здесь:
Каков тип второго параметра функций Polyline и Polygon? C++
Отличие getline() от cin.getline() C++
Объясните разницу между "cin.getline" и "std::getline" C++
C++ Функция, которая получает два параметра и возвращает результат деления первого параметра на второй
C++ Олимпиадная задача: превышение времени выполнения
C++ Как предотвратить превышение размера массива?
Превышение лимита времени для задачи с acmp C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.04.2009, 05:14     getline и превышение второго параметра... #2
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Вводишь 12345, в массиве s1="1234"
потому как футкция cin.getline(*string, sizeOfString) считывает sizeOfString - 1 символов в *string и в конец *string добавляет символ конца строки('\0') в итоге массив s1 будет содержать следующие значения :'1', '2', '3', '4', '\0'(всего 5 как видишь).


Цитата Сообщение от VorobeY1326 Посмотреть сообщение
а все следующие cin.get() возвращают 'я' !
Причем если заменяешь цикл на еще несколько cin.getline, то все они работают вхолостую!
Ничего не понимаю...((
Еще один момент в работе футкций getline и get, если было введено больше символов, чем sizeOfString - 1, то лишние символы отбрасываются и устанавливается бит состояния failbit в 1, при котором дальнейшее использование функций getline и get невозможна. Чтобы все нормально работало, нужно после использования getlin и get делать проверку бита состояния(функций cin.fail()), и в случе ошибки делать востановление потока ввода-вывода функцией cin.clear().
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 08:52  [ТС]     getline и превышение второго параметра... #3
Спасибо огромное!!!
А то я блин чуть не умер, пытаясь понять, в чем проблема))
Сейчас попробую сделать, как ты сказал!
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 09:32     getline и превышение второго параметра... #4
kazak, небольшая поправка: если верить С. Прата (а у меня нет оснований ему не верить), то только getline() при строке, длиннее чем под нее выделено, ставит failbit, а get() просто лишние символы оставляет во входной очереди. Однако get() устанавливает failbit при чтении пустой строки.
На самом деле, чтобы не гадать надо проверить, но в данный момент не могу =)
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 09:36  [ТС]     getline и превышение второго параметра... #5
А можно еще небольшой вопросик?))
А как очистить поток ввода?
То есть сделать его пустым?
Например, если я в предыдущем коде вводил "12345" , то в s1 было 1234\0 , а в потоке оставалось 5.
Но могло остаться и несколько символов!
Как сделать так, чтобы очистить поток, вне зависимости от кол-ва символов в нем?
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.04.2009, 11:18     getline и превышение второго параметра... #6
Цитата Сообщение от Noa Посмотреть сообщение
а get() просто лишние символы оставляет во входной очереди. Однако get() устанавливает failbit при чтении пустой строки.
Действительно не устанавливает

Цитата Сообщение от VorobeY1326 Посмотреть сообщение
А можно еще небольшой вопросик?))
А как очистить поток ввода?
То есть сделать его пустым?
Может какая специальная функция есть - не знаю, но попробуй такой вариант
C++
1
2
3
4
5
6
7
8
9
cin.getline(s1, 5);
if (cin.fail())
{
    cin.clear();
    while(cin.get() != '\n')
    {
        cin.ignore();
    }
}
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 11:47  [ТС]     getline и превышение второго параметра... #7
Цитата Сообщение от kazak Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
cin.getline(s1, 5);
if (cin.fail())
{
    cin.clear();
    while(cin.get() != '\n')
    {
        cin.ignore();
    }
}
Не прошло...
Видимо, потому что cin.getline оставил в потоке просто лишние символы без '\n' в конце...
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 11:51     getline и превышение второго параметра... #8
kazak, я не разбирался еще, но члену ignore() можно передавать параметры.
Из примера:
cin.ignore(255,'\n');
Отбросит или следующие 255 символов или вплоть до символа новой строки.
Если передать ему в качестве параметра просто '\n', то ерунда получается, а если с числом, то работает как надо. Надо покопать поглубже, но сейчас не могу...

Добавлено через 3 минуты 39 секунд
VorobeY1326, попробуй так:
C++
1
2
3
cin.getline(s1, 5);
cin.clear();
cin.ignore(255, '\n');
Должно сработать, но только если не более 255 символов, дальше надо поразбираться =)
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 11:53  [ТС]     getline и превышение второго параметра... #9
Noa, СУПЕР!!!
Фишка с cin.ignore(255, '\n') прокатила на ура!!
Всем спасибо большое!
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.04.2009, 12:23     getline и превышение второго параметра... #10
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Не прошло...
Видимо, потому что cin.getline оставил в потоке просто лишние символы без '\n' в конце...
что при этом программа выводит или не выводит? Я в Визуал С делал, щас в Билдер загнал - все работает. '\n' - это перевод строки он в любом случае должен присутствовать, ввод строки ты же ентером завершаешь.

Noa,
cin.ignore() - игнорировать один символ
cin.ignore(count) - игнорировать count символов
cin.ignore(count, delim) - игнорировать count символов или пока не встретится символ разделитель delim. Символ разделитель заключается в апострофы ' '.
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 13:08  [ТС]     getline и превышение второго параметра... #11
Ну да, но почему то не работало...))
Может, какая то фишка с особенностями cin.getline()...
В любом случае заработало с cin.ignore(255,'\n')! ))
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 13:19     getline и превышение второго параметра... #12
kazak, те cin.ignore('\n') такое не прокатит?
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.04.2009, 13:32     getline и превышение второго параметра... #13
cin.ignore('\n') хоть и компилится, но очень своеобразно работает.
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 13:36     getline и превышение второго параметра... #14
Это я заметил
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2009, 14:52     getline и превышение второго параметра...
Еще ссылки по теме:
Обработать превышение максимально возможного значения long C++
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов C++
C++ От класса String наследовать новый класс, который имеет проверку на превышение размера строки
C++ Как из первого класса достучаться до объекта второго, а из второго до метода первого?
C++ Выходной поток первого числа, второго , суммы первого и второго чисел

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

Или воспользуйтесь поиском по форуму:
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.04.2009, 14:52     getline и превышение второго параметра... #15
Совсем из головы вылетело:

Цитата Сообщение от Noa Посмотреть сообщение
C++
1
2
3
cin.getline(s1, 5);
cin.clear();
cin.ignore(255, '\n');
отработает безупречно, если getline получит больше символов, чем нужно, в противном случае ignore, не найдя символов в потоке, запросит их с клавиатуры, т.е. получится два ввода с клавиатуры, хотя предполагался один. Все таки надо после getline делать проверку состояния failbit'а
Yandex
Объявления
26.04.2009, 14:52     getline и превышение второго параметра...
Ответ Создать тему
Опции темы

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