Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ For循环不更新结构对象_C++_For Loop_Struct_Format - Fatal编程技术网

C++ For循环不更新结构对象

C++ For循环不更新结构对象,c++,for-loop,struct,format,C++,For Loop,Struct,Format,我是编程新手,今天我来到这里是因为我需要一个简单的练习来帮助我解决这个问题。该练习由以下几个小部分组成: 1) 使用两个x和y坐标(双精度)定义一个名为Point的结构 2) 提示用户输入7(x,y)对 3) 当我们读取这些对时,我们必须将它们存储在称为原始点的点向量中 这是我的第一次尝试: struct Point { double x; double y; }; istream& operator>>( istream& is, Point&am

我是编程新手,今天我来到这里是因为我需要一个简单的练习来帮助我解决这个问题。该练习由以下几个小部分组成:

1) 使用两个x和y坐标(双精度)定义一个名为Point的结构

2) 提示用户输入7(x,y)对

3) 当我们读取这些对时,我们必须将它们存储在称为原始点的点向量中

这是我的第一次尝试:

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";
    }
}
结构点{
双x;
双y;
};
istream&operator>>(istream&is,Point&p)
{
char ch1;
如果(is>>ch1&&ch1!='(')
{
is.unget();
is.clear(ios_base::failbit);//oops格式错误
回报是;
}
双v1,v2;
煤焦ch2,ch4;
is>>v1>>ch2>>v2>>ch4;
如果(!is | | ch2!=',“| | ch4!=”)错误(“错误读取”);//错误读取
p、 x=v1;
p、 y=v2;
回报是;
}
无效跳过字符到字符(字符字符)
{
if(cin.fail())
{
cin.clear();
对于(char ch;cin>>ch;)
{
if(ch==字符)
{
cin.unget();
返回;
}
}
}
if(cin.eof())错误(“无输入\n”);
}
int main()
{
尝试
{
cout>p;
跳过字符(“(”);//让我们尝试从一个简单的格式错误中恢复
原始点。推回(p);
}
}
捕获(运行时错误&e)
{

这里有很多不好的东西

首先,你不初始化点,所以它有一些随机数据。 随机数据并非如此随机,因为循环中的内存分配始终相同,因此变量将具有最后一个循环的数据

在运算符>>(…)中,如果第一个字符不是“(”字符,则这里有一个“return is” 所以你不用设置p.x和p.y就跳出来了

函数skip_to_character(…)是另一件不好的事情,除了它很难读取和使用for循环的一种非常糟糕的方式之外,当您输入“9,99”时将不会有“C”,所以我猜这里您会得到“无输入”输出

现在转到main中的for循环: 发生的情况如下:

  • 创建点p而不初始化它
  • 将垃圾从流中读取,将不会设置p
  • 你跳过垃圾
  • 将未初始化的点p推入向量
  • 如果您不相信p中没有数据,请尝试用0或其他东西初始化它,并检查输出:

    Point p = {0,0};
    

    你的
    istream&operator>>(istream&is,Point&p)
    操作符根本没有改变
    p
    ?@πάνταῥεῖ 我不明白你是什么意思…?你想知道为什么
    点p
    没有被
    cin>>p;
    改变,但是你实际上没有在这个操作符的实现中改变它。这就是为什么。操作符实现应该把数字读入
    p.x
    p.y
    ,对吗?@πάνταῥεῖ 是的,应该是这样,但为什么每次迭代后for循环都不创建新的点对象?你会如何为我的输入运算符编写代码?我想你最好再回到你的课本上。你似乎错过了一些基础知识。我现在要结束你无用的问题。