Проблема C++ GetLine(), программа командной строки

Я пишу эту программу для своего класса программирования, и у нее есть куча глупых ограничений, например, я должен использовать вложенные операторы if else, и я должен использовать cin.getLine(), чтобы получить имя игрока. Предполагается, что он захватит имя каждого игрока и подсчитает их средний результат.

Это не вся программа, а только та часть, где у меня возникает ошибка. Когда я запускаю это в командной строке, я могу получить первое имя в порядке, но после этого второй cin.getline() не читает никаких входных данных. Предложения?

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
    char name1[100], name2[100], name3[100];
    int numBat, numHit;
    double avg1, avg2, avg3;

    // Get Average for Player 1
    cout << "What's Your Name? ";
    cin.getline(name1, 100);

    cout << "How many times have you been at bat? ";
    cin >> numBat;

    if(numBat < 0 || numBat > 25)
    {
        cout << "ERROR ::: Number of Times at Bat Cannot Be Less Than 0 or Greater Than 25. Run Program Again." << endl;
        return 0;
    }
    else
    {

        cout << "How many times have you hit the ball? ";
        cin >> numHit;

        if(numHit < 0)
        {
            cout << "ERROR ::: Number Hit Cannot Be Less Than 0. Run Program Again." << endl;
            return 0;
        }
        else
        {
            // Calculate Average for Player 1
            avg1 = numHit / numBat;

            // Get Average for Player 2
            cout << "What's Your Name? ";
            cin.getline(name2, 100);

            cout << "How many times have you been at bat? ";
            cin >> numBat;

            cout << "How many times have you hit the ball? ";
            cin >> numHit;
                  }
         }
}

person Howdy_McGee    schedule 28.09.2011    source источник
comment
Хотел пометить это как домашнее задание... Но там уже 5 тегов. ржунимагу   -  person Mysticial    schedule 28.09.2011
comment
:/ обязательно ли иметь тег домашнего задания? Я чувствую, что это удерживает людей от помощи в решении моей проблемы...   -  person Howdy_McGee    schedule 28.09.2011


Ответы (3)


Думаю проблема в буфере. Попробуйте сбросить cin перед вторым getline:

cin.clear(); // clear the buffer
cin.sync();

если это не сработает, попробуйте что-то вроде этого:

cin.ignore(256, '\n'); // ignore the endline and char(256)
person RFasioli    schedule 28.09.2011
comment
Винрар - это ты! В чем разница между ignore и getline()? - person Howdy_McGee; 28.09.2011
comment
cin.clear() не очищает буфер, но очищает биты ошибки istream - person Mr.Anubis; 28.09.2011

После getline вам нужно вывести новую строку, используя cout << endl;.

person David Schwartz    schedule 28.09.2011
comment
Почему мне не пришлось делать это в моем первом cin.getline()? Проходит без проблем - person Howdy_McGee; 28.09.2011
comment
Вам нужно сделать это после первой «getline». Вот почему у тебя проблемы. После того, как человек вводит свое имя, вы не выводите новую строку, поэтому все, что вы пишете дальше, остается на той же строке. - person David Schwartz; 28.09.2011
comment
Я говорю, что верхняя половина программы работает нормально и, как и ожидалось, без вышеуказанного решения. Почему это? - person Howdy_McGee; 28.09.2011
comment
На самом деле теперь CIN вообще не работает, он не читает никаких входных данных. - person Howdy_McGee; 28.09.2011

Когда вы используете

   cin >> numBat;

Он не читает новую строку, поэтому следующий cin.getline() прочитает ее и продолжит.

Использовать

cin >> numBat;
cin.ignore(80,'\n');
person Vaughn Cato    schedule 28.09.2011
comment
На самом деле теперь CIN вообще не работает, он не читает никаких входных данных, и мы должны использовать getLine, не знаю, почему? - person Howdy_McGee; 28.09.2011