Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kozo
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 50
#1

Безконечый цикл при использовании cin и getline()

23.10.2016, 05:22. Просмотров 881. Ответов 8
Метки нет (Все метки)

Здравствуйте,

Есть вот такой простенький кусок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                string tempid;
            string tempname;
            string tempa;
            int templ=0;
            cout<<"ADD SONG"<<endl;
            cout<<"Enter song's unique ID: ";
            cin>>tempid;
            cout<<endl;
            cout<<"Enter song's name: ";
            
            getline(cin, tempname);
            cin.ignore();
            cout<<endl;
            cout<<"Enter artist's name: ";
            
            getline(cin, tempa);
            cin.ignore();
            cout<<endl;
            cout<<"Enter song's length (in seconds): ";
            cin>>templ;
            cin.ignore();
            cout<<endl;
Он успешно считывает первые три strings, но когда доходит до cin>>templ, то начинается безконечный цикл... Что это может быть?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2016, 05:22
Ответы с готовыми решениями:

Почему портится поток cin при использовании функции getline
char a; cin.getline(a,5); cin.clear(); При вводе свыше 5 символов после...

Почему при использовании getline( std::cin, str ) строка считывается не так, как ожидается?
Цель программы: При вводе строки, подсчитывает количество гласных букв....

Что делает цикл "while(cin.getline(buf,l_buf))" ?
не могу понять,что делает цикл:while(cin.getline(buf,l_buf))-это по сути...

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по...

Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами
Нужна помощь. Задача продемонстрировать различие между вводом с помощью cin.get...

8
DemolitionMan
129 / 155 / 87
Регистрация: 06.04.2016
Сообщений: 992
23.10.2016, 07:45 #2
Строка 21:
Цитата Сообщение от kozo Посмотреть сообщение
C++
1
cin.ignore();
- Вы применяли ignore к getline в 3 случаях выше, а тут Вы применяете его к cin. Может это неправильно?

Добавлено через 12 минут
Только так:
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
string tempid;
string tempname;
string tempa;
int templ=0;
cout<<"ADD SONG"<<endl;
cout<<"Enter song's unique ID:";
cin>>tempid;
cout<<endl;
cout<<"Enter song's name: ";
 
cin >> tempname;
cout << endl;
cout << "Enter artist's name:";
 
cin >> tempa;
cout << endl;
cout << "Enter song's length (in seconds):";
cin >> templ;
 
cout << "VVedennie znacheniya:\n";
cout << "Unique ID:" << tempid << '\n';
cout << "Song's name:" << tempname << '\n';
cout << "Artist's name:" << tempa << '\n';
cout << "Song's length:" << templ << '\n';
0
kozo
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 50
23.10.2016, 08:42  [ТС] #3
DemolitionMan, проблема в том, что некоторые имена могут иметь несколько слов,и их простым cin не прочитаешь. Что касается cin.ignore() - я пробовал его забрать после сin>>templ; всеравно безконечный цикл...
У меня этот код находится в while(char usrChar != 'q') если что, по этому и безконечный цикл. Но почему? Не могу понять
0
Даценд
Модератор
Эксперт .NET
4048 / 3888 / 2574
Регистрация: 20.04.2015
Сообщений: 7,060
23.10.2016, 09:28 #4
kozo,
Покажите код с циклом.
0
kozo
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 50
23.10.2016, 09:30  [ТС] #5
Даценд,
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
do {
        cout<<pName<<" PLAYLIST MENU"<<endl;
        cout<<"a - Add song\nd - Remove song\nc - Change position of song"<<endl;
        cout<<"s - Output songs by specific artist\nt - Output total time of playlist (in seconds)"<<endl;
        cout<<"o - Output full playlist\nq - Quit"<<endl;
        cout<<endl<<"Choose an option: ";
        cin>>usrChar;
        cout<<endl;
 
        
        switch(usrChar) {
            
            case 'o':
            cout<<pName<<" - OUTPUT FULL PLAYLIST"<<endl;
            if (head == 0) { 
            cout<<"Playlist is empty"<<endl<<endl;
            }
            else {
                int count =1;
                temp = head;
                 do{
                    cout<<count<<"."<<endl;
                    temp->PrintPlaylistNode();
                    temp = temp->GetNext();
                    count++;
                    cout<<endl;
                    
                }while(temp != 0);
                
            }
            
            break;
            case 'a':
            string tempid;
            string tempname;
            string tempa;
            int templ=0;
            cout<<"ADD SONG"<<endl;
            cout<<"Enter song's unique ID: ";
            cin>>tempid;
            cout<<endl;
            cout<<"Enter song's name: ";
            
            getline(cin, tempname);
            cin.ignore();
            cout<<endl;
            cout<<"Enter artist's name: ";
            
            getline(cin, tempa);
            cin.ignore();
            cout<<endl;
            cout<<"Enter song's length (in seconds): ";
            cin>>templ;
            cout<<endl;
            
 
            
            temp = new PlaylistNode(tempid, tempname, tempa, templ);
            if(head == 0) {
                head = temp;
            }
            else {
                tail->SetNext(temp);
            }
            tail = temp;
            break; 
        } 
    }while(usrChar != 'q');
Вот весь цикл и поблемный кусок внутри
0
DemolitionMan
129 / 155 / 87
Регистрация: 06.04.2016
Сообщений: 992
23.10.2016, 10:05 #6
Что касается ignore, я находил тему где модераторы объясняли зачем он нужен и это есть в популярных ошибках вверху. Но я забыл зачем это все нужно и где это находится. Там что-то в потоке содержится какой-то мусор(перенос строки или что-то в этом роде), я забыл короче. Модераторы, напомните, пожалуйста, зачем нужен ignore.

Добавлено через 16 минут
Код опять какой-то бредовый получился:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string tempid;
string tempname;
string tempa;
int templ=0;
cout<<"ADD SONG"<<endl;
cout<<"Enter song's unique ID: ";
cin>>tempid;
cout<<"\nEnter song's name: ";
cin.ignore();
getline(cin, tempname);
cout<<"\nEnter artist's name: ";
getline(cin, tempa);
cout<<"\nEnter song's length (in seconds): ";
cin>>templ;
 
cout << "\nVvedennie znacheniya:\n";
cout << "Unique ID: " << tempid << '\n';
cout << "Song's name: " << tempname << '\n';
cout << "Artist's name: " << tempa << '\n';
cout << "Song's length: " << templ << '\n';
Добавлено через 2 минуты
Бред, потому что перед 10 строкой есть ignore, а перед 12 - нет.
0
Даценд
Модератор
Эксперт .NET
4048 / 3888 / 2574
Регистрация: 20.04.2015
Сообщений: 7,060
23.10.2016, 11:33 #7
Лучший ответ Сообщение было отмечено kozo как решение

Решение

kozo,
как-то так:
C++
6
7
8
9
cout<<endl<<"Choose an option: ";
usrChar=cin.get();
cin.ignore();
cout<<endl;
и
C++
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
case 'a':
    string tempid;
    string tempname;
    string tempa;
    int templ=0;
    cout<<"ADD SONG"<<endl;
    cout<<"Enter song's unique ID: ";
    getline(cin, tempid);
    cout<<endl;
    cout<<"Enter song's name: ";
    getline(cin, tempname);
    cout<<endl;
    cout<<"Enter artist's name: ";
    getline(cin, tempa);
    cout<<endl;
    cout<<"Enter song's length (in seconds): ";
    cin >> templ;
    cin.ignore();
    cout<<endl;
1
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
23.10.2016, 16:09 #8
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Модераторы, напомните, пожалуйста, зачем нужен ignore.
Распространенные ошибки
0
kozo
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 50
23.10.2016, 22:22  [ТС] #9
Даценд, помогло,спасибо! Тоесть cin. ignore() нужно писать только после cin>> а не после getline()
0
23.10.2016, 22:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2016, 22:22

Cin.getline() не работает при динамическом выделении памяти
Почему в таком коде cin.getline() работает не так как надо? Если очистить...

При множественном наследовании не работает getline(std::cin, ?)
Изучаю множественное наследование, так вот, нужно ввести два слова, но...

Не работает cin.getline при считывании строки большей буфера
Доброго всем времени суток!:) Проблема состоит в том, что если ввести 4 и более...


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

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

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