在C++中访问结构体数组的成员

3

我正在学习C++ Primer Plus,尝试从动态分配的结构体数组中输入数据。其中一个项目是char数组。我该如何写入这些结构体成员?以下是我错误尝试的代码,以便您了解我想做什么。

    #include <iostream>
using namespace std;

struct contributions
{
    char name[20];
    double dollars;
};

int donors;

int main()
{
    cout << "How many contributors will there be?\n";
    cin >> donors;
    contributions * ptr = new contributions[donors];
    for(int i = 0; i <= donors; i++)
    {
        cout << "Enter donor name #" << i+1 << ": \n";
        cin >> ptr->contributions[i].name;
        cout << "Enter donation amount: \n";
        cin >> ptr->contributions[i].dollars;
    }

Thanks in advance!

4个回答

3
cin >> ptr[i].name;

ptr是变量名,它的类型是contributions*。它是一个contributions数组,所以要访问第i个成员,使用ptr[i]。然后通过ptr[i].name访问该成员的name字段。此外,cin >> char[]可能不起作用(我不确定),因为char[]更像是C语言的东西,而cin是C++。因此,您可能需要将name的类型更改为std::string

顺便说一句,惯例是用单数名词来命名结构体/类。因此,contribution是一个更正确的名称;每个实例代表一个单独的贡献


我刚写完这个,你就发了这个...+1。我对楼主的代码是如何编译通过的感到困惑。 - rmeador
OP从未说过他的代码究竟出了什么问题;我猜测它实际上是无法编译。 - Nick Lewis
抱歉造成困扰。是的,它没有编译通过,指出我引用结构体(contributions)时有误。感谢你对命名约定的纠正,我之前不知道。 - scribbles

2

尝试使用std :: string代替char [20]作为名称,示例应该可以正常工作。

struct contributions
{
    std::string name;
    double dollars;
};

同时更改对应的访问权限

ptr[i].name

22|错误:无效使用“结构体contributions”|我将该行更改为“string name;”,并收到了该错误。 - scribbles

0
此外,使用一个贡献的std::vector将使代码更简单。目前存在内存泄漏问题。如果这是直接从C++ Primer Plus中获取的内容,我强烈建议您改用一本教授现代、正确C++的教材,例如Koenig & Moo的Accelerated C++

0

cin >> ptr[i].name;(正确的形式)会在第一个空格字符处停止(如果在数组中的20个空格用尽之前没有这样的字符,则会出现缓冲区溢出的风险)。请改用cin.getline(ptr[i].name, 20)


如果我将结构体中的“int name[20]”改为“char name[20]”或“string name”,那么该行中的“20”代表什么? - scribbles
那么您就不需要提供那个数字(字符串将根据需要增长)。 - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接