Как получить 2 дюйма из Cin в C ++? - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь получить три пары 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 ]

2 голосов
/ 08 сентября 2011

Цикл 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;
}
1 голос
/ 08 сентября 2011

Когда cin >> pt терпит неудачу, он оставляет символ конца строки в потоке.Это приводит к немедленному завершению следующего извлечения, создавая бесконечный цикл.

Добавьте cin.ignore() в конец цикла, чтобы удалить конец строки с ошибкой;тогда следующее извлечение будет ждать большего ввода.

...