2

可能重复:
两次使用 cin 的问题

这段代码有效,但不是我想要的。每次我想通过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并且只计算下一个输入。请帮帮我。提前致谢。

4

2 回答 2

3

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

于 2012-12-22T09:47:40.067 回答
1

std::basic_ios::eof()(in 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;
        }
    }
于 2012-12-22T09:45:53.500 回答