如何在C ++中从cin获得2个int?

时间:2011-09-08 12:17:45

标签: c++ cin

我试图从用户那里得到三对int。但如果我输入字母,我的代码会进入不定式循环。我做错了什么?

struct Point
{
    int x;
    int y;
};

istream& operator>> (istream& is, Point& pt)
{
    int x, y;
    is >> x >> y;
    if (!is) 
        return is;
    pt.x = x;
    pt.y = y;
    return is;
}

int main()
{
    vector<Point> points;
    Point pt;
    while (true)
    {
        if (cin >> pt)
        {
            points.push_back(pt);
            if (points.size() == 3)
                break;
            continue;
        }
        cout << " error, try again" << endl; 
        cin.clear();
    }

    for (int i = 0; i < 3; i++)
        cout << "(" << points[i].x << ", " << points[i].y << ")" << endl;
}

2 个答案:

答案 0 :(得分:2)

while (true) ...循环永不停止。 break永远不会执行,因为cin >> pt一直失败。你无法通过简单的istream操作解决这个问题,因为cin&gt;&gt;一旦你提供了错误的输入,pt将永远不会成功。要么是正确的输入,要么是完全失败,如果不是:

while (points.size() < 3 && (cin >> pt))
{
    points.push_back(pt);
}
if (points.size() < 3) throw "up";

或将输入作为字符串读取并将其解析为单独的操作。

当我们参与其中时,请简化您的提取器:

istream& operator>>(istream& is, Point& pt)
{
    Point p;
    if (is >> p.x >> p.y) pt = p;
    return is;
}

答案 1 :(得分:1)

cin >> pt失败时,它会在流中留下行尾字符。这会导致下一次提取立即失败,从而产生无限循环。

cin.ignore()添加到循环的末尾以删除失败行的结尾;然后下一个提取将等待更多输入。