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

How to get 2 ints from cin in C++?

本文关键字:2个 int cin c++ 中从      更新时间:2023-10-16

我试图从用户获得三对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;
}

while (true) ...循环永不停止。break永远不会执行,因为cin >> pt总是失败。您无法通过简单的istream操作来解决这个问题,因为一旦您提供了错误的输入,cin>> 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;
}

cin >> pt失败时,它在流中留下行结束符。这将导致下一次提取立即失败,从而创建无限循环。

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