2009-07-14 14 views
3

Durch C++ Primer Plus arbeiten und versuche, Daten in einem dynamisch zugewiesenen Array von Strukturen zu cin. Eines der Elemente ist ein Char-Array. Wie schreibe ich in diese Strukturmitglieder? Code meines falschen Versuches schreiben, also können Sie sehen, was ich versuche zu tun.Zugreifen auf Mitglieder eines Arrays von Strukturen in 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; 
    } 

Vielen Dank im Voraus!

Antwort

2

Versuchen Sie mit std :: string anstelle von char [20] für den Namen und das Beispiel sollte gut funktionieren.

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

auch den Zugang zu ändern

ptr[i].name 
+0

22 | Fehler: ungültige Verwendung von 'Struct-Beiträgen '| Ich änderte die Zeile in "String-Name;" und habe diesen Fehler erhalten. – scribbles

3
cin >> ptr[i].name; 

ptr ist der Name der Variablen, ist es vom Typ contributions*. Es handelt sich um ein Array von contributions. Um auf das i te Element zuzugreifen, verwenden Sie ptr[i]. Dann greifen Sie über ptr[i].name auf das Feld name dieses Mitglieds zu. Auch cin >> char[] funktioniert möglicherweise nicht (ich erinnere mich nicht sicher), char[] ist eher eine C-isch Sache, während cin ist C++. Daher müssen Sie möglicherweise den Typ name in std :: string ändern.

Als Nebenbemerkung ist die Konvention, Ihre Strukturen/Klassen mit einem Singular Nomen zu benennen. Somit wäre contribution ein korrekterer Name; Jede Instanz repräsentiert einen einzigen Beitrag.

+0

Ich habe das gerade geschrieben, als du es gepostet hast ... +1. Ich bin verwirrt, wie der OP-Code sogar kompiliert. – rmeador

+0

Nun, der OP hat nie gesagt, was genau mit seinem Code schief gelaufen ist; Meine Vermutung ist, dass es tatsächlich nicht kompiliert wurde. –

+0

Ich entschuldige mich für die Verwirrung. Ja, es wurde nicht kompiliert, und es wurde angegeben, dass ich die Strukturbeiträge falsch angegeben habe. Danke für die Korrektur der Namenskonvention, das wusste ich nicht. – scribbles

0

Auch mit einem std :: Vektor der Beiträge w2ill machen den Code viel einfacher. So wie es ist, haben Sie ein Speicherleck. Wenn dies direkt von C++ Primer Plus ist, würde ich ernsthaft vorschlagen, zu einem Lehrbuch zu wechseln, das Ihnen modernes, korrektes C++ lehrt, wie zB Accelerated C++ von Koenig & Moo.

0

cin >> ptr[i].name; (die richtige Form) würde beim ersten Leerzeichen aufhören (und einen Pufferüberlauf riskieren, wenn kein solches Zeichen kommt, bevor die 20 Felder im Array erschöpft sind). Verwenden Sie stattdessen cin.getline(ptr[i].name, 20).

+0

Was wäre die "20" in dieser Zeile, wenn ich es in einen "Char-Namen [20]" in der Struktur zu "String-Name" geändert hätte? – scribbles

+0

Dann müssten Sie diese Nummer nicht angeben (die Zeichenfolge wird nach Bedarf vergrößert). –

Verwandte Themen