【问题标题】:For loop not updating struct objectFor循环不更新结构对象
【发布时间】: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&amp; operator&gt;&gt;(istream&amp; is, Point&amp; p) 运算符根本没有更改p
  • @πάνταῥεῖ 我不明白你的意思... ??
  • 您想知道为什么 Point p 没有被 cin &gt;&gt; p; 更改,但实际上您在实现该运算符时并没有更改它。这就是为什么。运算符实现应该将数字读入p.xp.y,对吧?
  • @πάνταῥεῖ 是的,它应该,但为什么每次迭代后 for 循环都不会创建一个新的 Point 对象?您将如何为我的输入运算符编写代码?
  • 我认为你最好再回到你的课本上。你似乎遗漏了一些基础知识。我现在要结束投票你无用的问题。

标签: c++ for-loop struct format


【解决方案1】:

这里有很多地方不好。

首先,你没有初始化Point,所以它有一些随机数据。 随机数据不是那么随机,因为循环中内存分配总是一样的,所以变量会有最后一次循环的数据。

在 operator>>(...) 这里你有一个“return is”,如果第一个字符不是 '(' 所以你没有设置 p.x 和 p.y. 就跳出那里。

函数 skip_to_character(...) 是另一件不好的事情,除了难以阅读和使用 for 循环的一种非常糟糕的方式之外,当你输入“9,99)”所以我猜你在这里得到“无输入”输出。

现在进入 main 中的 for 循环: 这是发生了什么:

  1. 您创建了一个点 p 而不对其进行初始化
  2. 您从流中读取的垃圾和 p 不会被设置
  3. 你跳过垃圾
  4. 您将未初始化的点 p 推入向量中

如果你不相信我 p 中没有数据。尝试用 0 或其他东西初始化它并检查输出:

Point p = {0,0};

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2014-06-16
    • 1970-01-01
    相关资源
    最近更新 更多