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

Возможный дубликат:
Проблема использования 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, и будет рассчитан только следующий ввод. Помогите мне с этим, пожалуйста. Заранее спасибо.


person sg552    schedule 22.12.2012    source источник


Ответы (2)


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

person Bo Persson    schedule 22.12.2012
comment
Да, это проблема. Добавление cin.get() в финал if statement решило проблему. Спасибо еще раз. - person sg552; 22.12.2012

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;
        }
    }
person Zeta    schedule 22.12.2012