Обновление одной и той же переменной несколько раз
Возможный дубликат:
Проблема использования 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;
}
}