2009-07-14 76 views
3

通过C++ Primer Plus进行工作,并试图将数据cin转换为动态分配的结构数组。其中一个项目是一个char数组。我如何写这些结构成员?发布我错误的尝试代码,以便您可以看到我想要做的事情。访问C++中的结构数组的成员

#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; 
    } 

在此先感谢!

回答

2

尝试使用std :: string而不是char [20]作为名称,并且示例应该可以正常工作。

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

也接入更改为

ptr[i].name 
+0

22 |错误:无效使用`struct contribution'| 我将行更改为“字符串名称”并收到该错误。 – scribbles 2009-07-14 15:20:08

3
cin >> ptr[i].name; 

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

顺便说一句,约定是用单数名词命名你的结构/类。因此contribution将是一个更正确的名字;每个实例代表单一贡献

+0

我只是在你发布它时写这个... +1。我很困惑OP的代码是如何编译的。 – rmeador 2009-07-14 15:19:40

+0

那么OP从未说过他的代码究竟出了什么问题;我的猜测是它实际上并没有编译。 – 2009-07-14 15:22:48

0

此外,使用一个std ::向量贡献w2ill使代码更简单。因为它是,你有一个内存泄漏。如果这是直接来自C++ Primer Plus,那么我会认真地建议改为一本教你现代,正确的C++的教科书,例如Koenig & Moo的Accelerated C++

0

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