struct/Zeiger
-
Hi
sorry für soviel Code, aber ich poste lieber einmal alles, da ich gerade echt nicht mehr weiterkomme. Problem ist, dass mir Student[0].Nachname überschrieben wird... muss dazu sagen, dass ich Zeigeranfänger bin.#include <stdio.h> #include <stdlib.h> #include <string.h> #define LINELEN 256 typedef struct s { char *matrikel; char *nachname; char *vorname; char *fach; } stud; stud student[100]; int anzahl=2; void anzeigen(){ printf("MatrikelNr\tName\tVorname\tStudienfach\n"); printf("-------------------------------------------------------\n"); int i; for(i=0;i<anzahl;i++) { printf("%s", &student[0].nachname); //printf("%s\t%s\t%s\t%s\n", student[i].matrikel, student[i].nachname, student[i].vorname, student[i].fach); } } int main(){ char val='\0'; char line[ LINELEN+1 ]; int ende=0; FILE *pDatei; char zeile[LINELEN]; pDatei=fopen("C:\\IT_Projekt\\stud.dat", "r"); if(pDatei!=NULL) { int i=0; int j=0; char *token; while(1) { if(fscanf(pDatei, "%s\n", &zeile)==-1) break; int k; token=strtok(zeile, ";"); for(k=0;token!=NULL;k++) { switch(k) { case 0: student[j].matrikel=malloc(sizeof(token)); student[j].matrikel=token; break; case 1: student[j].nachname=malloc(sizeof(token)); student[j].nachname=token; break; case 2: student[j].vorname=malloc(sizeof(token)); student[j].vorname=token; break; case 3: student[j].fach=malloc(sizeof(token)); student[j].fach=token; break; } token=strtok(NULL, ";"); } // Ausgabe zur Fehlersuche... printf("%s\n", student[0].nachname); j++; } } else printf("Es ist noch keine Datensicherung vorhanden."); fclose(pDatei); //printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStudierendenverwaltung (Vers. 1.0)\n\n"); printf("----------------------\n\n"); printf(" A (Anzeigen)\t\tQ (Programm beenden)\n\n"); printf(" B (Bearbeiten)\n\n"); printf(" N (Neu anlegen)\n\n"); printf(" L (Loeschen)\n\n"); printf(" \n\n"); printf("-----------------------\n\n"); while( !ende ){ printf("Eingabe: "); if( fgets( line, LINELEN, stdin ) == NULL ){ printf("Fehler in fgets()\n"); return -1; } if( sscanf( line, "%c", &val) != 1 ){ printf("Fehler in sscanf()\n"); return -1; } switch ( val ){ case 'A' : anzeigen(); break; //case 'B' : ... //... case 'Q' : ende=1; break; default : printf("\nFalsche Eingabe!\n\n"); } } int z; for(z=0;z<anzahl;z++) { free(student[z].fach); free(student[z].matrikel); free(student[z].nachname); free(student[z].vorname); } printf("Programm beendet.\n"); return 0; }
stud.dat
12321;Mustermann;Max;IT07 12121;Voll;Idiot;IT08
Danke für jegliche Hilfe.
-
student[j].matrikel=malloc(sizeof(token)); student[j].matrikel=token;
Da solltest du strcpy benutzen und keine Zuweisung.
-
außerdem ist strlen(token) die richtige Länge des Strings- sizeof(token) liefert nur die Größe des Zeiger. Und man reserviert immer strlen + 1 Zeichen, da das '\0'-Zeichen aucg gespeichert werden soll.