我试图从用户那里得到三对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;
}
答案 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()
添加到循环的末尾以删除失败行的结尾;然后下一个提取将等待更多输入。