【发布时间】:2015-11-20 15:39:49
【问题描述】:
我是编程新手,今天我来到这里是因为我需要帮助来完成一个我正在尝试解决的简单练习。练习由多个小部分组成:
1) 定义一个名为 Point 的结构体,其中包含两个 x 和 y 坐标(双精度)。
2) 提示用户输入 7 个 (x,y) 对。
3) 当我们读取这些对时,我们必须将它们存储在称为 original_points 的点向量中。
所以这是我的第一次尝试:
struct Point {
double x;
double y;
};
istream& operator>>( istream& is, Point& p )
{
char ch1;
if ( is >> ch1 && ch1 != '(' )
{
is.unget();
is.clear( ios_base::failbit ); // oops format error
return is;
}
double v1, v2;
char ch2, ch4;
is >> v1 >> ch2 >> v2 >> ch4;
if ( !is || ch2 != ',' || ch4 != ')' ) error( "Bad reading" ); // messed up reading
p.x = v1;
p.y = v2;
return is;
}
void skip_to_character( char character )
{
if ( cin.fail() )
{
cin.clear();
for ( char ch; cin >> ch; )
{
if ( ch == character )
{
cin.unget();
return;
}
}
}
if ( cin.eof() ) error( "No input\n" );
}
int main()
{
try
{
cout << "Please enter seven (x,y) coordinates : \n";
vector<Point> original_points;
for ( int i = 0; i < 7; ++i )
{
Point p;
cin >> p;
skip_to_character( '(' ); // let's try to recover from a simple format error
original_points.push_back( p );
}
}
catch ( runtime_error& e )
{
std::cerr << "Error : " << e.what() << '\n';
}
catch ( ... )
{
cerr << "Unexpected error \n";
}
}
如果发生简单的格式错误,我会尝试通过跳过每个字符来恢复,直到程序到达“(”。我的问题是,如果我尝试输入错误的输入格式,例如:9,99),代码将push_back() 错误发生后的第一个正确读数和错误发生前的第一个正确读数。因此,例如,如果我尝试输入此类数据:
(1,2)
9,99)
(5,6)
我的向量中将包含三个元素:(1,2)、(1,2) 和 (5,6)。似乎当我在每个条件检查后进入循环时 P 的值保持不变,而不是为每次迭代创建一个新的 Point 对象。你能帮我解决这个问题吗?为什么会发生此错误?谢谢你
【问题讨论】:
-
您的
istream& operator>>(istream& is, Point& p)运算符根本没有更改p? -
@πάνταῥεῖ 我不明白你的意思... ??
-
您想知道为什么
Point p没有被cin >> p;更改,但实际上您在实现该运算符时并没有更改它。这就是为什么。运算符实现应该将数字读入p.x和p.y,对吧? -
@πάνταῥεῖ 是的,它应该,但为什么每次迭代后 for 循环都不会创建一个新的 Point 对象?您将如何为我的输入运算符编写代码?
-
我认为你最好再回到你的课本上。你似乎遗漏了一些基础知识。我现在要结束投票你无用的问题。
标签: c++ for-loop struct format