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.


Anmelden zum Antworten