Аукционный проект: ошибка C ++ с cin - PullRequest
1 голос
/ 04 февраля 2012

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

Проблема

Код продолжает автоматически пропускать Cin после запросадля "Идентификатор Bidder1" и перейти прямо к сообщению об ошибке ошибки: Идентификатор участника не заполнен.Я использую созданную мной функцию с именем getName, которая, как я понял, является проблемой, но другие места, используемые в коде, работают правильно.

int main()
{
    double bid1, bid2;//declare bid1, bid2

    printHeader();

    string lotName= getName("Enter lot name: "); //lot name
    double reservePrice= getPrice("Reserve price: $");
    if (reservePrice<=0) {
        printErrorMessage(5);
        return 0;
    }

    cout<<"\n";

    string bidder1= getName("Bidder 1 ID: "); //bidder1 name


    if (bidder1== "") {
        printErrorMessage(3);
        bid1=0;
    }

    else {
        bid1= getPrice("Bidder1 price: $"); //bidder 1 price
        bool lead= isBidPriceGood (bid1, reservePrice); //true if bid1>reservePrice
        if (lead==true)
            cout<<"\n"<<bidder1<<" is high bidder, current price = $"<<bid1<<endl<<endl;
    }

    string bidder2= getName("Bidder 2 ID: "); //bidder2 name

    getline(cin,bidder2);

    if (bidder2== "") {
        printErrorMessage(3);
        bid2=0;
    }
    else {
        bid2= getPrice("Bidder1 price: $"); //bidder 2 price
        isBidPriceGood (bid2, reservePrice); //true if bid2>reservePrice
    }

    //function

    string getName(string prompt)
    {
        string name;
        cout<<prompt;
        getline(cin,name);
        return name;
    }




    double getPrice(string prompt)
    {
        string x;
        double price;
        cout<< prompt;
        cin>>price;
        getline(cin,x);
        return price;
    }

    void printErrorMessage(int num)
    {
        if (num == 1) {
            cout << endl
                << "  ERROR: Reserve not met, bid rejected" << endl << endl;
        } else if (num == 2) {
            cout << endl
                << "  ERROR: Negative price, bid rejected" << endl << endl;
        } else if (num == 3) {
            cout << endl
                << "  ERROR: Blank bidder ID, no bid allowed" << endl << endl;
        } else if (num == 4) {
            cout << endl
                << "ERROR: Neither bidder met Reserve, auction canceled" << endl << endl;
        } else if (num == 5) {
            cout << endl
                << "ERROR: Reserve is not positive, auction canceled" << endl << endl;
        } else {
            cout << "   This should never print" << endl << endl;
        }
    }

1 Ответ

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

getline(cin,name) будет читать до следующего перевода строки.Возможно, у вас уже есть новая строка, ожидающая во входном потоке, от какого-то предыдущего ввода, который вы не читали в новой строке.Например, ваш cin>>price будет читать число, но не будет читать новую строку после этого номера, поэтому, если вызову getName предшествует вызов getPrice, то новая строка после цены будетвсе еще жду, и getName увидит его как конец строки.


Отредактировано для обновленного вопроса: Вам необходимо изменить это:

string bidder2= getName("Bidder 2 ID: "); //bidder2 name

getline(cin,bidder2);

только на это:

string bidder2= getName("Bidder 2 ID: "); //bidder2 name

Вы понимаете, почему?

...