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

getline vs посимвольный ввод - C++

Восстановить пароль Регистрация
 
 
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
20.10.2013, 21:07     getline vs посимвольный ввод #1
Задача http://acm.timus.ru/problem.aspx?space=1&num=1446 (тимус)
Кликните здесь для просмотра всего текста
1446. Волшебная шляпа
Ограничение времени: 1.0 секунды
Ограничение памяти: 64 МБ
В начале каждого учебного года в Хогвартсе происходит исключительно важное событие — распределение юных колдунов по факультетам. Находчивые и изобретательные попадают в Слизерин, отважные — в Гриффиндор, трудолюбивые — в Хаффлпаф, а сообразительные — в Рэйвенкло. Распределение проходит следующим образом: когда называется фамилия очередного первокурсника, он выходит в центр зала и надевает знаменитую шляпу Гриффиндора. Шляпа, оценив обстановку в голове колдуна или ведьмы, громко выкрикивает факультет. Специальный эльф ведет протокол распределения. После распределения ему надо срочно составить список учеников по факультетам. Члены общества Против Угнетения Колдовских Народов-Изгоев предлагают вам помочь уставшему за много лет эльфу в этом нелегком деле.
Исходные данные
В первой стоке указано количество учеников-первогодников N (1 ≤ N ≤ 1000). В следующих 2N строках указаны их имена и факультеты, которые назвала шляпа. Имя ученика может содержать прописные и заглавные буквы латинского алфавита, пробелы и знак дефиса. Длина каждого имени не больше 200 символов.
Результат
Выведите список учеников по факультетам: сначала название факультета, потом двоеточие, в следующих сроках список учеников по одному в строке. Первым должен идти список Слизерина, потом — Хаффлпаф, Гриффиндор, и Рэйвенкло. Между списками факультетов надо оставлять пустую строку. Ученики в списках по факультетам должны идти в том же порядке, в котором их вызывали на примерку шляпы. Известно, что каждый год на каждый факультет попадает по крайней мере один ученик.


Этот вариант кода работает бесконечно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main() {
    vector<string> Slytherin, Hufflepuff, Gryffindor, Ravenclaw;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        string s, s1;
        char c;
        cin >> c;
        while (c!='\n')
        {
            s+=c;
            cin >> c;
        }
        cin >> s1;
    //  cout << s << endl << s1 << endl;
        if (s1 == "Slytherin") Slytherin.push_back(s);
        else if (s1 =="Hufflepuff") Hufflepuff.push_back(s);
        else if (s1 =="Gryffindor") Gryffindor.push_back(s);
        else if (s1 =="Ravenclaw") Ravenclaw.push_back(s);
    }
    if (Slytherin.size()>0)
    {
        cout << "Slytherin:" << endl;
        for (int i = 0; i < Slytherin.size(); i++)
            cout << Slytherin[i] << endl;
    }
    if (Hufflepuff.size()>0)
    {
        cout<< endl << "Hufflepuff:" << endl;
        for (int i = 0; i < Hufflepuff.size(); i++)
            cout << Hufflepuff[i] << endl;
    }
    if (Gryffindor.size()>0)
    {
        cout<< endl << "Gryffindor:" << endl;
        for (int i = 0; i < Gryffindor.size(); i++)
            cout << Gryffindor[i] << endl;
    }
    if (Ravenclaw.size()>0)
    {
        cout<< endl << "Ravenclaw:" << endl;
        for (int i = 0; i < Ravenclaw.size(); i++)
            cout << Ravenclaw[i] << endl;
    }
    return 0;
}
Если сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main() {
    vector<string> Slytherin, Hufflepuff, Gryffindor, Ravenclaw;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        string s, s1;
                getline (cin, s);
        cin >> s1;
    //  cout << s << endl << s1 << endl;
        if (s1 == "Slytherin") Slytherin.push_back(s);
        else if (s1 =="Hufflepuff") Hufflepuff.push_back(s);
        else if (s1 =="Gryffindor") Gryffindor.push_back(s);
        else if (s1 =="Ravenclaw") Ravenclaw.push_back(s);
    }
    if (Slytherin.size()>0)
    {
        cout << "Slytherin:" << endl;
        for (int i = 0; i < Slytherin.size(); i++)
            cout << Slytherin[i] << endl;
    }
    if (Hufflepuff.size()>0)
    {
        cout<< endl << "Hufflepuff:" << endl;
        for (int i = 0; i < Hufflepuff.size(); i++)
            cout << Hufflepuff[i] << endl;
    }
    if (Gryffindor.size()>0)
    {
        cout<< endl << "Gryffindor:" << endl;
        for (int i = 0; i < Gryffindor.size(); i++)
            cout << Gryffindor[i] << endl;
    }
    if (Ravenclaw.size()>0)
    {
        cout<< endl << "Ravenclaw:" << endl;
        for (int i = 0; i < Ravenclaw.size(); i++)
            cout << Ravenclaw[i] << endl;
    }
    return 0;
}
вводится какойто НЁХ. Как впрочем и с
C++
1
cin >> s; sin >> s1;
Кто-нибудь может подсказать проблему.

Добавлено через 7 минут
Формат ввода
Кликните здесь для просмотра всего текста
7
Ivan Ivanov
Gryffindor
Mac Go Nagolo
Hufflepuff
Zlobeus Zlei
Slytherin
Um Bridge
Slytherin
Tatiana Henrihovna Grotter
Ravenclaw
Garry Potnyj
Gryffindor
Herr Mionag-Ranger
Gryffindor

Вывода
Кликните здесь для просмотра всего текста
Slytherin:
Zlobeus Zlei
Um Bridge

Hufflepuff:
Mac Go Nagolo

Gryffindor:
Ivan Ivanov
Garry Potnyj
Herr Mionag-Ranger

Ravenclaw:
Tatiana Henrihovna Grotter
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
20.10.2013, 21:20
  #2

Не по теме:

НЁХ - это что-то новенькое

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.10.2013, 21:37     getline vs посимвольный ввод #3
Цитата Сообщение от BrainFuck Посмотреть сообщение
Если сделать так
C++
1
(cin >> n).get();
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
20.10.2013, 21:40  [ТС]     getline vs посимвольный ввод #4
не-а, не робит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.10.2013, 21:47     getline vs посимвольный ввод #5
Шо не робит?

Добавлено через 1 минуту
C++
1
(cin >> s1).get();
Добавлено через 3 минуты
Теперь робит...
Миниатюры
getline vs посимвольный ввод  
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 10:10  [ТС]     getline vs посимвольный ввод #6
т.е. s читаем cin'ом, а s1 (cin >> s1).get()'ом?

Добавлено через 12 часов 14 минут
по-подробнее можно?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 11:17     getline vs посимвольный ввод #7
Цитата Сообщение от BrainFuck Посмотреть сообщение
по-подробнее можно?
О чём?
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 11:26  [ТС]     getline vs посимвольный ввод #8
О вводе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 11:28     getline vs посимвольный ввод #9
Код работает?
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 11:42  [ТС]     getline vs посимвольный ввод #10
с
C++
1
(cin >> s1).get()
не сработало. Ладно. Всё равно спасибо. переписал на паскаль=(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 11:48     getline vs посимвольный ввод #11
Цитата Сообщение от BrainFuck Посмотреть сообщение
не сработало.
Почему тогда у меня работает (скрин)? Я сделал (и выложил) два исправления: 3 и 5 пост.
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 11:55  [ТС]     getline vs посимвольный ввод #12
Скинте вот фрагмент кода на ввод
вот эту часть.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        string s, s1;
        (cin >> s).get();
        (cin >> s1).get();
    //  cout << s << endl << s1 << endl;
        if (s1 == "Slytherin") Slytherin.push_back(s);
        else if (s1 =="Hufflepuff") Hufflepuff.push_back(s);
        else if (s1 =="Gryffindor") Gryffindor.push_back(s);
        else if (s1 =="Ravenclaw") Ravenclaw.push_back(s);
    }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:00     getline vs посимвольный ввод #13
После cin >> в потоке остаётся '\n' (попадает туда при нажатии Enter). Если дальше getline(), то для неё это будет первый символ. Для getline() - это пустая строка. Она его извлечёт из потока, в строку чтения поместит '\0', и код пойдёт, без остановки на ввод, дальше. В коде, ввод через cin >> перед getline(), происходит в двух местах: первый раз перед циклом (cin >> n), второй раз - в каждой итерации цикла (cin >> s1). Тут и нужно извлечь '\n' из потока. Извлекается '\n' так:
C++
1
2
cin >> n;
cin.get(); // извлекает один символ из потока чтения, в данном коде '\n'
Тоже самое можно записать одной строкой:
C++
1
(cin >> n).get();
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
 (cin >> n).get();
    for (int i = 0; i < n; i++)
    {
        string s, s1;
        getline (cin, s);
       (cin >> s1).get();
    //  cout << s << endl << s1 << endl;
        if (s1 == "Slytherin") Slytherin.push_back(s);
        else if (s1 =="Hufflepuff") Hufflepuff.push_back(s);
        else if (s1 =="Gryffindor") Gryffindor.push_back(s);
        else if (s1 =="Ravenclaw") Ravenclaw.push_back(s);
    }
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 12:08  [ТС]     getline vs посимвольный ввод #14
выход теперь (онлайн компилятор Ideone.com):
Кликните здесь для просмотра всего текста
Slytherin:
Zlobeus Zlei
Um Bridge

Hufflepuff:
Mac Go Nagolo

Gryffindor:
Ivanov
Garry Potnyj
Herr Mionag-Ranger

Ravenclaw:
Tatiana Henrihovna Grotter
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:12     getline vs посимвольный ввод #15
Цитата Сообщение от BrainFuck Посмотреть сообщение
выход теперь
И? Должно быть не так?
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 12:15  [ТС]     getline vs посимвольный ввод #16
Имя у Иванова (первый на вводе) пропало
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:17     getline vs посимвольный ввод #17
Цитата Сообщение от BrainFuck Посмотреть сообщение
Имя у Иванова (первый на вводе) пропало
Для этого нужно видеть, как был сделан ввод. У меня не пропадает.
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 12:20  [ТС]     getline vs посимвольный ввод #18
Вот так
Кликните здесь для просмотра всего текста
7
Ivan Ivanov
Gryffindor
Mac Go Nagolo
Hufflepuff
Zlobeus Zlei
Slytherin
Um Bridge
Slytherin
Tatiana Henrihovna Grotter
Ravenclaw
Garry Potnyj
Gryffindor
Herr Mionag-Ranger
Gryffindor

Тимус же.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:22     getline vs посимвольный ввод #19
В коде ввод сделан под формат ввода из первого поста. Т.е. первая строка - несколько слов, вторая - одно.

Добавлено через 55 секунд
Цитата Сообщение от BrainFuck Посмотреть сообщение
Вот так
Если вот так и код, как у меня, то смотрите скрин. Там не пропало?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2013, 12:24     getline vs посимвольный ввод
Еще ссылки по теме:

Ввод данных в структуру - cin.getline C++
C++ Посимвольный файловый ввод
Функция getline пропускает ввод строки C++

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

Или воспользуйтесь поиском по форуму:
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 12:24  [ТС]     getline vs посимвольный ввод #20
Там нет. *Бюсь головой об клаву* онлайн компиляторы!!!! За что вы меня так????
Yandex
Объявления
21.10.2013, 12:24     getline vs посимвольный ввод
Ответ Создать тему
Опции темы

Текущее время: 18:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru