для пропуска цикла getline - PullRequest
       15

для пропуска цикла getline

1 голос
/ 01 февраля 2012

Привет всем. Я выполняю задание по программированию для структурированных данных, и мне кажется, что я понимаю, как работает структура.

Я пытаюсь прочитать список имен учеников, идентификационные номера (A-номера) иих баланс.

Когда я компилирую свой код, он будет читать все в первый раз, но во второй раз в цикле и каждый раз после, он запрашивает имя пользователя, но пропускает getline и идет прямодля ввода номера A и номера.

Любая помощь будет принята с благодарностью.Просто пытаюсь понять, как заставить getline работать каждый раз, когда цикл повторяется.

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main(){
    const int maxStudents = 30;
    struct Students{
        string studentName;
        int aNumber;
        double outstandingBalance;};

    Students students[maxStudents];

    for(int count = 0; count < maxStudents-1; count++)
    {
        cout<<"Student Name:";
                cin.ignore();
        getline(cin,students[count].studentName);
        cout<<"\nA-Number:";
        cin>>students[count].aNumber;
        if(students[count].aNumber == -999)
            break;
        cout<<"\nOutstanding Balance:";
        cin>>students[count].outstandingBalance;
    }

    cout<<setw(20)<<"A-Number"<<"Name"<<"Balance";

    for(int count2 = 29; count2 >= maxStudents-1; count2--)
        cout<<setw(20)<<students[count2].aNumber<<students[count2].studentName<<students[count2].outstandingBalance;


    system("pause");
    return 0;
}

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

Причина, по которой вы не работаете, состоит в том, что операторы '>>' в первый раз не извлекают завершающий '\n', следующий getline видит его и сразу же возвращается с пустымline.

Простой ответ: не смешивайте getline и >>.Если вход ориентирован на линию, используйте getline.Если вам нужно проанализировать данные в строке, используя >>, используйте строку, прочитанную getline, чтобы инициализировать std::istringstream, и используйте >> для нее.

3 голосов
/ 01 февраля 2012

Поиск C ++ FAQ по iostreams .

Пункт 15.6 конкретно касается вашей проблемы («Почему моя программа игнорирует мой запрос ввода после первой итерации?»), Но вы можете найти всю страницу полезной.

НТН,

1 голос
/ 05 января 2013

Put

cin.ignore();

в конце цикла.

0 голосов
/ 28 октября 2013

Проблема со смешением cin и getline. Форматированный ввод (с оператором >>) и неформатированный ввод (пример getline) не очень хорошо сочетаются друг с другом. Вы должны обязательно прочитать больше об этом. Нажмите здесь для более подробного объяснения .

Вот решение вашей проблемы. cin.ignore(1024, '\n'); является ключом.

for(int count = 0; count < maxStudents-1; count++)
{
    ...
    cout<<"\nOutstanding Balance:";
    cin>>students[count].outstandingBalance;
    cin.ignore(1024, '\n');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...