0

我在理解指针方面遇到了很多麻烦,而且我已经到了需要一点指导的地步。这是我到目前为止编写的代码:

#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>

using namespace std;

//Declare structure
struct Airports{
    string name;
    string airID;
    double elevation;
    double runway;};

void dispdata(Airports *);
void getdata(Airports *);


int main()
{
    Airports *airptr; 
    airptr = new Airports [3];

    getdata(airptr);
    dispdata(airptr);

    system ("PAUSE");
    return 0;

}

void getdata(Airports *p)
{
    for (int i = 0; i < 3; i++)
    {
        cout << "Enter the name of airport " << i+1 << ": ";
        getline(cin, p->name);
        cout << "Enter the airport " << i+1 << " identifier: ";
        getline(cin, p->airID);
        cout << "Enter the elevation for airport " << i+1 << ": ";
        cin >> p->elevation;
        cout << "Enter the runway length for airport " << i+1 << ": ";
        cin >> p->runway;
        cout << endl;

        p++;
    }

    cout << "Thanks for entering your values!";
}

void dispdata(Airports *p)
{
    cout << "\nHere are the data values you entered:" << endl;
    cout << "\n\t\tAirport info" << endl;
    cout << "Airport\tAirID\tElevation\tRunway Length" << endl;
    cout << "----------------------------------------------------------------" << endl;

    cout << fixed << setprecision(2);

    for (int i = 0; i<3; i++)
    {
        cout << p[i].name << "\t" << p[i].airID << "\t" << p[i].elevation << "\t"     << p[i].runway << endl;
        p++;
    }

}

这个想法是创建一个动态分配的结构数组,并将一个可以指向数组每个元素的指针传递给两个函数。这可以成功编译,但是因为我不太了解它的语法,所以它不会很好地结束。

我敢肯定,主要问题在于 getdata 函数。每次我尝试将其更正为我认为应该的方式时,我都会遇到语法错误。如何正确更改数组每个元素中指针指向的值?

4

2 回答 2

1

在您的displaydata()函数中,您将不得不删除p++,因为您也在增加 index i,因此每次迭代,您实际上是从数组中读取第二个下一个元素(在第 0 个元素之后,您将读取第 2 个,然后是第 4 个),并且因此,您将越过数组绑定。

此外,在您的getdata()方法中,由于 agetline()跟随 a cin(来自上一次迭代),未读的换行符cin将被视为 的下一个输入getline()。为避免此问题,请将其放在cin.get()循环的末尾。

因此,您需要进行 2 处更改:

void getdata(Airports *p)
{
    for (int i = 0; i < 3; i++)
    {
        cout << "Enter the name of airport " << i+1 << ": ";
        // ... skipping ...
        cin >> p->runway;
        cout << endl;
        cin.get();    // put this line to "absorb" the unwanted newline

        p++;
    }


void dispdata(Airports *p)
{
    // ... skipping ...
    for (int i = 0; i<3; i++)
    {
        cout << p[i].name << "\t" << p[i].airID << "\t" << p[i].elevation << "\t"     << p[i].runway << endl;
//        p++;    // remove this line, for reason described in the answer
    }

}

此外,请避免使用system("PAUSE");此处讨论的原因:system("pause"); - 为什么错了? 而是使用cin.get()getchar()

于 2012-12-12T06:38:56.303 回答
0

我喜欢你构建程序的方式,这是理解使用指针和结构的概念的最简单方式。

我在您的代码中看到的唯一错误是,尽管您在主函数中创建了一个结构数组并将其传递给填充,但是您在 getdata( ) 和 dispdata() 函数。

因此,如果您必须使此代码片段有效,则需要访问基于索引的结构数组。例如Airports *p[1] where 3<i>0

所以有两种方法可以修复你的代码

  1. 要么传递一个结构而不是发送结构数组。
  2. 将整个结构数组传递给 getdata 和 dispdata 函数并围绕结构集循环以分配值或显示每个结构的值(Airports *p)。
于 2012-12-12T06:35:00.307 回答