Обновление одной и той же переменной несколько раз

Возможный дубликат:
Проблема использования Cin дважды

Этот код работает, но не то, что я хотел. Каждый раз, когда я хочу ввести новую зарплату, нажав 1 вывод в командной строке будет выглядеть так:

Comic books             : USD Input error! Salary must be in positive integer.



Код должен остановиться на cout<<"\n\nComic books\t\t: USD "; в строке 4, но он просто выполняется с внутренним циклом while. Это код:

    double multiplePay =0;

    cout<<"\n\nEnter employee pay for each job";
    while (1){
    cout<<"\n\nComic books\t\t: USD ";
    //cin.get(); if enable, the first user input will be 0. this is not working.

    std::string comic_string;
    double comic_double;
    while (std::getline(std::cin, comic_string))
    {
        std::stringstream ss(comic_string); // check for integer value

        if (ss >> comic_double)
        {
            if (ss.eof())
            {   // Success so get out
                break;
            }
        }

        std::cout << "Input error! Salary must be in positive integer.\n" << std::endl;
        cout<<"Employee salary\t: ";
    }

    comic = strtod(comic_string.c_str(), NULL);

        multiplePay = comic + multiplePay; // update previous salary with new user input
        cout << multiplePay;
    cout << "Add other pay?"; // add new salary again?
    int y;

    cin >> y;
    if (y == 1){


        cout << multiplePay;
    }
    else{
        break;
    }
    } // while

cout << multiplePay;  //the sum of all salary

С помощью cin.get() решит проблему, но первый пользовательский ввод заработной платы станет 0 и только следующий вход будет рассчитан. Помоги мне с этим, пожалуйста. Заранее спасибо.

2 ответа

Решение

Ваша проблема в том, что cin >> y; будет читать int, но оставить конец строки \n во входном буфере. В следующий раз вы используете getline, он найдет этот конец строки немедленно и не будет ждать больше ввода.

std::basic_ios::eof()ss.eof()) не работает, как вы думаете, это работает.

    if (ss >> comic_double)
    {
        if (ss.eof())
        {   // Success so get out
            break;
        }
    }

ss.eof() будет верно, только если вызов ss.get() или другой сбой извлечения, потому что вы были в конце файла. Неважно, находится ли курсор в данный момент в конце.

Обратите внимание, что это очень легко исправить с помощью ss.get():

    if (ss >> comic_double)
    {
        ss.get(); // if we are at the end ss.eof() will be true after this op

        if (ss.eof())
        {   // Success so get out
            break;
        }
    }
Другие вопросы по тегам