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
Winrar сте вие! Каква е разликата между 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