Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52

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

23.10.2016, 05:22. Показов 2312. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2016, 05:22
Ответы с готовыми решениями:

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

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

Программа уходит в бесконечный цикл при использовании while и cin
Суть такова, хочу добавлять строки в вектор пока пользователь не введет пустую сроку. Но после ее введения программа бесконечно просит...

8
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
23.10.2016, 07:45
Строка 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
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
23.10.2016, 08:42  [ТС]
DemolitionMan, проблема в том, что некоторые имена могут иметь несколько слов,и их простым cin не прочитаешь. Что касается cin.ignore() - я пробовал его забрать после сin>>templ; всеравно безконечный цикл...
У меня этот код находится в while(char usrChar != 'q') если что, по этому и безконечный цикл. Но почему? Не могу понять
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
23.10.2016, 09:28
kozo,
Покажите код с циклом.
0
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
23.10.2016, 09:30  [ТС]
Даценд,
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
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
23.10.2016, 10:05
Что касается 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
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
23.10.2016, 11:33
Лучший ответ Сообщение было отмечено 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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.10.2016, 16:09
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Модераторы, напомните, пожалуйста, зачем нужен ignore.
Распространенные ошибки
0
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 52
23.10.2016, 22:22  [ТС]
Даценд, помогло,спасибо! Тоесть cin. ignore() нужно писать только после cin>> а не после getline()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.10.2016, 22:22
Помогаю со студенческими работами здесь

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

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

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

Объясните работу методов cin.getline и cin.ignore
Фрагмент программы ниже. Что делают cin.getline и cin.ignore (12-13 строки) void WorkWithBooks(int Books) { if (Books &gt; 0) ...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru