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

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

Войти
Регистрация
Восстановить пароль
 
 
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
#1

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

20.10.2013, 21:07. Просмотров 1042. Ответов 23
Метки нет (Все метки)

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

Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод - C++
Было дано вот такое задание: В этой задаче вам необходимо написать функцию getline, которая читает строку из стандартного потока ввода...

Посимвольный ввод - C++
Подскажите пожалуйста как можно осуществить посимвольный ввод с клавиатуры с учетом перехода на новую строку... _getch устраивает...

Посимвольный ввод/ вывод - C++
Всем, доброго времени суток. Прошу помочь с одной программкой, с которой есть проблемы.. Необходимо разработать и отладить процедуру...

Посимвольный файловый ввод - C++
К стыду своему, провозился с кодом весь вечер. Цель такова: записать слова в двумерный массив (размерность заранее не определена, потому...

Cin.getline, ввод 2 переменных - C++
Здравствуйте. Подскажите, где ошибся Первое значение пропускает и не дает его ввести, остается пустым, второе значение заполняется... ...

Ввод данных в структуру - cin.getline - C++
Добрый день, Задача загрузить информацию в структуку Songs (автор, имя, год) . Однако когда в цикле for запрашиваю данные, первый...

23
zer0mail
20.10.2013, 21:20
  #2

Не по теме:

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

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

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

Добавлено через 12 часов 14 минут
по-подробнее можно?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 11:17 #7
Цитата Сообщение от BrainFuck Посмотреть сообщение
по-подробнее можно?
О чём?
1
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 11:26  [ТС] #8
О вводе.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 11:28 #9
Код работает?
1
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 11:42  [ТС] #10
с
C++
1
(cin >> s1).get()
не сработало. Ладно. Всё равно спасибо. переписал на паскаль=(
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 11:48 #11
Цитата Сообщение от BrainFuck Посмотреть сообщение
не сработало.
Почему тогда у меня работает (скрин)? Я сделал (и выложил) два исправления: 3 и 5 пост.
1
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 11:55  [ТС] #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);
    }
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:00 #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);
    }
1
Мозготрёп
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 43
21.10.2013, 12:08  [ТС] #14
выход теперь (онлайн компилятор Ideone.com):
Кликните здесь для просмотра всего текста
Slytherin:
Zlobeus Zlei
Um Bridge

Hufflepuff:
Mac Go Nagolo

Gryffindor:
Ivanov
Garry Potnyj
Herr Mionag-Ranger

Ravenclaw:
Tatiana Henrihovna Grotter
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2013, 12:12 #15
Цитата Сообщение от BrainFuck Посмотреть сообщение
выход теперь
И? Должно быть не так?
1
21.10.2013, 12:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2013, 12:12
Привет! Вот еще темы с ответами:

Функция getline пропускает ввод строки - C++
Строка с getline(cin, pc.name); пропускает ввод. Пишу getline(cin, pc.name); так, как нужно ввести строку с пробелами. Подскажите ,что...

Некорректный ввод строк с использованием функции getline - C++
Здравствуйте столкнулся с магической проблемой функция getline(); криво работает когда вызывается с другой функции. #include...

Ввод двух getline подряд работает некорректно - C++
При вызове функции vvod, запрос фамилии игнорируется , просто выводит фразу и тут же переходит к вводу имени. Не могу понять в чем...

В ходе работы программы она не останавливается на ввод с getline() - C++
Необходимо заполнить массив объектов структуры. В структуре два поля: фамилия и год рождения. Но при запуске программы ввод фамилии...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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