Problem mit Struct Array
-
Hallo.
Ich habe ein Problem und zwar hab ich ein Struct 'student' erstellt und wollte davon ein Array erstellen. Dieses Array wollte ich dann in der Methode 'einfuegen' mit Werten füttern und in 'suche' könnte man dann nach dem Vornamen eines Studenten suchen. Beides scheint aber nicht zu klappen, ich bin mir nicht mal sicher, ob die Methode einfuegen einen neuen Struct in das Array schreibt. Bei der suche bekomme ich eine Fehlermeldung. Ich hab in meinem Code mal die Zeilen, bei denen ich mir am meisten unsicher bin ob sie richtig sind, mal mit einem ??? Kommentar versehen.
#include <stdlib.h> #include <string.h> /* Typ 'student' definieren */ typedef struct { char name[20], vorname[20]; long matrikelnummer, punkte; } student ; void suche(student *pointer, int counter); void einfuegen(student *pointer, int counter); int main(void) { int list_length, menu; int counter = 0; /* Länge der Liste abfragen und Liste vom Typ student erstellen */ printf("Länge der Liste angeben\n"); scanf("%d", &list_length); /* student-Array erstellen */ student *teilnehmer; teilnehmer = malloc(list_length*sizeof(student)); /* Auswahlliste */ while(menu!=3) { printf("Bitte wählen..\n"); printf(" (1) Einfügen\n"); printf(" (2) Suchen\n"); printf(" (3) Beenden\n"); scanf("%d", &menu); /* unzulässige Eingabe */ if(menu>3 || menu<1) printf("Es können nur unten angeführte Menüpunkte ausgewählt werden.\n"); /* Student in die Liste einfügen */ else if(menu==1) { /* aber nur wenn die Liste noch nicht voll ist */ if(counter<list_length) { einfuegen(teilnehmer, counter); counter++; } else { printf("Die Liste ist bereits voll\n"); } } /* Studenten in der Liste suchen */ else if(menu==2) { suche(teilnehmer, counter); } } } /* trägt einen neuen Student in der Liste ein */ void einfuegen(student *pointer, int counter) { student s; printf("Vornamen: "); scanf("%s", &s.vorname); printf("Nachname: "); scanf("%s", &s.name); printf("Matrikelnummer: "); scanf("%ld", &s.matrikelnummer); printf("Erreichte Punkte: "); scanf("%ld", &s.punkte); *(pointer+counter) = s; /* ??? */ } /* sucht nach dem Vornamen eines Studenten */ void suche(student *pointer, int counter) { int i, match; char *s; /* gesuchten Namen abfragen */ printf("Den gesuchten Namen eingeben: "); scanf("%s", &s); /* Namen suchen */ for(i=0; i<counter; i++) { if(strcmp(s, *pointer[i].name)==0) { /* ??? */ match = 1; break; } } if(match==1) printf("JA\n"); else printf("NEIN\n"); }
Danke im voraus..
-
"bekomme ich eine Fehlermeldung" reicht nicht. Was für ein Fehler und in welcher Zeile?
-
guter Punkt. In Zeile 85 bekomme ich als Fehlermeldung "Speicherzugrissfehler". Ich kompiliere das ganze mit gcc unter Linux.
-
Mal so eine Sache am Rande: warum nicht mit vektoren?
#include <vector> //weitere include... //dein struct: struct abc{ string name; int punkte; //punkte=-1: noch keine Prüfungsergebnisse hinterlegt abc(string s){name=s; punkte=-1...}; } vector<abc> v_abc int main(){ string name="heinz"; //neuer Student: v_abc.push_back(name); //note des neuesten Studenten hinzufügen: v_abc[int(v_abc.size())-1].punkte=17; //fügt im letzten Datensatz die Punktzahl ein return 0; }
ohne das ich mich nun so für den c-profi halte (eher im Gegenteil), wäre das so viel einfacher.(so meine persönliche Meinung, vectoren sind eine feine Sache, wurde hier im Forum auf die Dinger mal aufmerksam gemacht :D)
-habe den Code nicht getestet, also nicht strg+c machen, aber so ungefähr könnte es dann aussehen-
-
Hi,
maSu schrieb:
ohne das ich mich nun so für den c-profi halte (eher im Gegenteil)
100% agree
maSu schrieb:
, wäre das so viel einfacher.(so meine persönliche Meinung, vectoren sind eine feine Sache, wurde hier im Forum auf die Dinger mal aufmerksam gemacht :D)
Wenn man das mit C benutzen koennte haetteste recht. Gibts aber leider in C nicht
Peace & Blessed Love C0de4Fun
-
Naja das Problem ist, dass das ne Hausaufgabe ist und wir nur die Sachen nehmen sollen, die wir schon können. Und Vektoren kennen wir noch nicht.
-
ja okay, wenn ihr das nicht benutzen dürft, dann wird es hässlich
@code4fun: ich bin immerhin ehrlich
-
maSu, du hast ein Semikolon vergessen! :p
-
Hi,
@_matze: Da fehlen sogar zwei Semikolon
Aber nicht tragisch da er gesagt hat das es nicht getestet ist
Wir wollen Leuten ja helfen es zu lernen und es nicht vorkauenSo, nun zum wesentlichen.
Zum einlesen:*(pointer+counter) = s;
ist garnicht fein...
lies am besten mitscanf("%s", pointer->vorname)
ein. Das sollte reichen.
In der main() brauchst du dann Counter nicht mehr mit angeben. Musst aber den Aufruf so gestalten:einfuegen(teilnehmer[counter]);
Zum suchen: Der Fehler liegt schonmal beim strcmp... Gleich weiß ich mehr...
Und ja, war auch kein Thema:
for(i=0; i<counter; i++, pointer++) { if(strcmp(s, pointer->name)==0) { /* ??? */ match = 1; break; } }
das funktioniert bei mir einwandfrei!
-
Hi boldty,
Den Laufzeitfehler bekommst du, da dein Pointer 's' auf irgendeine Adresse zeigt, auf die du nicht zugreifen darfst / kannst.
Um den Fehler zu beheben könntest du beispielsweise ein Array verwenden:void suche(student *pointer, int counter) { int i, match; char s[256] = ""; printf("Den gesuchten Namen eingeben: "); scanf("%s", s); /* Bei Arrays und Zeigern muss man den Adressoperator weglassen (2. Argument) */ for(i=0; i<counter; i++) { if(strcmp(s, pointer[i].name)==0) { match = 1; break; } } if(match==1) printf("JA\n"); else printf("NEIN\n"); }
@Skalli: Der Fehler liegt bzw. lag nicht an der strcmp-Funktion. Deine Variante ist zwar recht elegant aber die andere funktioniert auch
Gez. monstermunchkin