多次更新同一个变量

时间:2012-12-22 09:41:01

标签: c++ while-loop cin

  

可能重复:
  Problem of using cin twice

此代码有效但不符合我的意图。每次我想通过按1输入新工资时,命令提示符下的输出将如下所示:

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



代码应该在第4行的cout<<"\n\nComic books\t\t: USD ";处停止,但它只是在内部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 个答案:

答案 0 :(得分:3)

您的问题是cin >> y;将读取一个int,但将行尾\n留在输入缓冲区中。下次使用getline时,它会立即找到此行结束,而不是等待任何更多输入。

答案 1 :(得分:1)

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;
        }
    }