cin und char-array-pointer in der struct
Als c++ - Anfänger habe ich geschrieben das folgenden code:
int main(void){
struct car{
char * make[200];
int manfYear;
};
int num=0;
cout << "How many cars do you wish to catalogue? ";
cin >> num;
car * Cars = new car [num];
for (int i=1;i<=num;i++){
cout << "Car #" << i << ":" << endl << "Please enter the make: ";
cin.getline(*Cars->make,200);
cout << "Please enter the year made: ";
cin >> Cars->manfYear;
}
Mein problem ist, dass ich nicht bekommen kann meinen Kopf Runde ein problem, wo bekomme ich einen segmentation Fault, wenn das Programm läuft an der Stelle muss ich zu geben Sie die Modell des Autos. Kann mir bitte jemand erklären, was ich falsch mache?
Soweit ich es verstehe, ich bin vorbei ein Zeiger auf das array "machen", das sollte damit es funktioniert. Ist mein Verständnis Weg?
Vielen Dank im Voraus
Dan
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vier Fragen, die ich sofort sehen:
Ausgabe 1
In Ihrem
struct
Sie haben:char * make[200];
In Englisch, das sagt, "erstellen Sie ein array von 200 Zeiger auf Zeichen", wenn ich denke, Sie wollen sagen, "erstellen Sie ein array von 200 Zeichen." So sollten Sie statt:
char make[200]
.Ausgabe 2
Sind Sie Fehlverhalten ab
1
. Dies überspringt das erste Auto in der array - erinnern-arrays sind null-indiziert. So sollten Sie statt:for (int i = 0 ; i < num ; i++)
und für die Anzeige, man könnte sagen:
cout << "Car #" << (i+1) << ":" << endl << "Please enter the make: ";
Ausgabe 3
Wo Sie sagen:
cin.getline(*Cars->make,200);
und
cin >> Cars->manfYear;
Dort, wo in diesen Zeilen, die Sie angeben, welches Auto der Benutzer ist das Auffüllen? Nirgends. Wenn man looping mit
i
, dann müssen Sie eigentlich erwähnti
. Diese arbeiten sollten:cin.getline(Cars[i].make,200);
und
cin >> Cars[i].manfYear;
Feststellen, dass wir mit
.
, nicht->
. Dies ist, weil die Elemente in derCars
array sind die aktuellen Instanzen, keine Zeiger. DieCars
array selbst ist ein Zeiger, aber nicht seinen Inhalt.Ausgabe 4
Alle Kredit @Ben C wer wies dies ersten: mischen der
>>
Betreiber mitgetline()
Funktion aufcin
können führen zu seltsamen Verhalten, mit übrig gebliebenenCR
's aus>>
geht in diegetline()
nennen. Sie könnten entweder alle>>
(Nachteil: Sie haben nicht die200
limit erzwungen, wenn das Lesen der machen) oder allecin.getline()
(Nachteil: Sie haben die Verwendung von string-Puffer und dann konvertieren Sie Sie für die Anzahl der Fahrzeuge und Jahr), oder setzencin.ignore()
nach jedem Aufruf von>>
etwa so:und
Wieder, alle Kredit, um @Ben C für bemerkt es zuerst.
Nicht Zuletzt
Durch Konvention, Klassen/structs haben Kapital-Namen und Variablen klein - /camelcase Namen. Betrachten Sie die Umbenennung der
struct
auscar
zuCar
), und das array vonCars
zucars
. In anderen Worten, die Umkehrung der Kapitalisierung, die Sie jetzt haben.Schließlich, ich Stimme mit all die anderen Poster hier: sollten Sie in Betracht ziehen
string
stattchar
arrays.Verwenden Sie zuerst
string
statt der Arme alte Cchar[]
.Weiter: Sie wollen nicht
char * make[200];
. Sie möchtenchar make[200];
.char * make[200]
ist ein array von 200 Zeiger aufchar
s, die verwendet werden können, wie die 200 null-terminierte Zeichenfolgen - aber dann müssten Sienew[]
jeden von Ihnen. Verwenden Sie einfachchar make[200];
undcin.getline(Cars->make, 200);
.char * make[200]
deklariert ein array von 200 Zeigern; ich vermute, dies ist nicht, was Sie suchen.Wenn Sie einfach nur suchen, um zu speichern eine Zeichenfolge, würde ich empfehlen, einen Blick in die C++ -
string
Art statt.Gab es auch ein paar andere kleinere Problemchen mit Ihrem code.
1) Sie war mit
Cars->manfYear
- dies wird immer nur verweisen Sie auf das erste element des array. Ich nehme an, Sie wollen das nicht; die subscripting-syntax als proCars[i-1].manfYear
wird Zugriff auf ein einzelnes Auto-Objekt in das array. (Denken Sie daran, dass array-Indizes beginnen bei null! - würde es eigentlich besser treffen idiomatischen Sinn für Ihr für loop variable bei null anfangen wie gut wirklich)2) vorsichtig Sein, die Art und Weise
std::getline
und die>>
symbol zusammen zu arbeiten. die>>
(stream-extraction operators) oft Blätter alle neue-Zeile-Zeichen, was bedeutet, dass Sie möglicherweise finden Sie unter "seltsam" Verhalten bei Ihren anrufen zu getline. Wenn Sie mischen die beiden zusammen, dann mit so etwas wiestd::cin.ignore()
wird Ihnen helfen, entsorgen Sie die neue-Zeile-Zeichen.Zunächst arrays in C++ sind indiziert von 0..n-1, so dass die Schleife ausgeführt werden muss
Zweitens, Sie haben erklärt
make
als 200-element-array von Zeiger zuchar
; dies ist wahrscheinlich nicht, was Sie wollen. Wennmake
soll zum speichern einer Zeichenfolge, deklarieren Sie es als eine einfache Reihe vonchar
:Schließlich schreiben Sie Ihre
getline
Ruf alsObwohl
Cars
ist deklariert als pointer verwenden, können Sie den subskript-operator auf es , als ob es ein array wäre; dadurch werden Sie implizit zu dereferenzierenCars
, daa[i]
wird interpretiert als*(a + i)
. Dies bedeutet auch, dass Sie die.
Komponentenauswahl-operator im Gegensatz zu den->
Betreiber, da die Art derCars[i]
istcar
, nichtcar *
.Zunächst
char *make[200]
ist nicht ein string von max 200 Zeichen, aber 200 Zeiger aufchar
.Zweite Sache: Sie sind die Dereferenzierung der Zeiger in
cin.getline
mit*
: was passiert, ist, dass Sie erhalten den enthaltenen Wert in der ersten Zelle der 200char*
Zeiger. Aber Sie hat nicht initialisieren die einzelnen Zeiger, nur die höhere Ebene ein, so bekommt man einen segmentation Fault.Nur ändern
char* make[200]
zuchar make[200]
und*Cars->make
zuCars[i].make
.->
/.
/.Cars
ist eincar*
, nicht eincar**
.