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

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

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

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

25.04.2009, 18:55. Просмотров 3614. Ответов 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 я подряд?? К чему бы вдруг??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2009, 18:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос getline и превышение второго параметра... (C++):

Каков тип второго параметра функций Polyline и Polygon? - C++
Каков тип второго параметра функций Polyline и Polygon?

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

Объясните разницу между "cin.getline" и "std::getline" - C++
string a; cin.getline(a); getline(cin, a);в чем разница между &quot;cin.getline(a);&quot; и &quot;getline(cin, a);&quot;

Функция, которая получает два параметра и возвращает результат деления первого параметра на второй - C++
Тут такая задача: написать функцию, которая получает два параметра тип unsigned short int и возвращает результат деления первого параметра...

Как предотвратить превышение размера массива? - C++
Вот программа(из следующей темы http://www.cyberforum.ru/cpp-beginners/thread167119.html) #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Олимпиадная задача: превышение времени выполнения - C++
вот задача Задача B-Sum 2 Задача B Ограничение времени: 1 с Ограничение памяти: 64 M На стандартном потоке ввода задаётся...

14
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
26.04.2009, 05:14 #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().
2
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 08:52  [ТС] #3
Спасибо огромное!!!
А то я блин чуть не умер, пытаясь понять, в чем проблема))
Сейчас попробую сделать, как ты сказал!
0
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 09:32 #4
kazak, небольшая поправка: если верить С. Прата (а у меня нет оснований ему не верить), то только getline() при строке, длиннее чем под нее выделено, ставит failbit, а get() просто лишние символы оставляет во входной очереди. Однако get() устанавливает failbit при чтении пустой строки.
На самом деле, чтобы не гадать надо проверить, но в данный момент не могу =)
2
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 09:36  [ТС] #5
А можно еще небольшой вопросик?))
А как очистить поток ввода?
То есть сделать его пустым?
Например, если я в предыдущем коде вводил "12345" , то в s1 было 1234\0 , а в потоке оставалось 5.
Но могло остаться и несколько символов!
Как сделать так, чтобы очистить поток, вне зависимости от кол-ва символов в нем?
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
26.04.2009, 11:18 #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();
    }
}
1
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 11:47  [ТС] #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' в конце...
0
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 11:51 #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 символов, дальше надо поразбираться =)
1
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 11:53  [ТС] #9
Noa, СУПЕР!!!
Фишка с cin.ignore(255, '\n') прокатила на ура!!
Всем спасибо большое!
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
26.04.2009, 12:23 #10
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Не прошло...
Видимо, потому что cin.getline оставил в потоке просто лишние символы без '\n' в конце...
что при этом программа выводит или не выводит? Я в Визуал С делал, щас в Билдер загнал - все работает. '\n' - это перевод строки он в любом случае должен присутствовать, ввод строки ты же ентером завершаешь.

Noa,
cin.ignore() - игнорировать один символ
cin.ignore(count) - игнорировать count символов
cin.ignore(count, delim) - игнорировать count символов или пока не встретится символ разделитель delim. Символ разделитель заключается в апострофы ' '.
0
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
26.04.2009, 13:08  [ТС] #11
Ну да, но почему то не работало...))
Может, какая то фишка с особенностями cin.getline()...
В любом случае заработало с cin.ignore(255,'\n')! ))
0
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 13:19 #12
kazak, те cin.ignore('\n') такое не прокатит?
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
26.04.2009, 13:32 #13
cin.ignore('\n') хоть и компилится, но очень своеобразно работает.
0
Noa
57 / 34 / 4
Регистрация: 08.04.2008
Сообщений: 158
26.04.2009, 13:36 #14
Это я заметил
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
26.04.2009, 14:52 #15
Совсем из головы вылетело:

Цитата Сообщение от Noa Посмотреть сообщение
C++
1
2
3
cin.getline(s1, 5);
cin.clear();
cin.ignore(255, '\n');
отработает безупречно, если getline получит больше символов, чем нужно, в противном случае ignore, не найдя символов в потоке, запросит их с клавиатуры, т.е. получится два ввода с клавиатуры, хотя предполагался один. Все таки надо после getline делать проверку состояния failbit'а
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2009, 14:52
Привет! Вот еще темы с ответами:

Обработать превышение максимально возможного значения long - C++
Как с помощью C++ exception я могу обработать, к примеру, следующее? long pp = 2147483647; pp = pp + 1;

Превышение лимита времени для задачи с acmp - C++
есть код, решал задачу с acmp (№157) и код #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; using namespace std; ...

Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов - C++
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов int или float и возвращают...

От класса String наследовать новый класс, который имеет проверку на превышение размера строки - C++
Доброго времени суток! Решаю задачи из учебника Роберта Лафоре ООП в C++. До этой задачи все решал сам и успешно, а тут встал в...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
26.04.2009, 14:52
Ответ Создать тему
Опции темы

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