Chaos mit Zeigern



  • Hallo,

    ich habe ein kleines Problem. Vor kurzem habe ich mit C angefangen und mit diverse Bücher gelesen und Tutorien durchgemacht.
    Heute wollte ich dann ein kleines Programm schreiben, welches in einer doppeltverketteten Liste Einträge eines Telefonbuchs speichert.
    Diese Einträge sollen aus einer Datei eingelesen und dann an die Liste angehängt werden.
    Hier erstmal die Grundtypen.
    Zum Programmstart erschaffe ich mir mit der init Funktion eine neue Liste und reserviere hierfür den Speicher:

    Telefonbuch* tbuch = (Telefonbuch*) malloc(sizeof (Telefonbuch));
        if (tbuch == NULL) {
            printf("Kein Arbeitsspeicher vorhanden.\n");
            exit(EXIT_FAILURE);
        };
        tbuch->first = NULL;
        tbuch->last = NULL;
        tbuch->count = 0;
        return tbuch;
    

    Im nächsten Schritt wird dann wie man hier sehen kann, die Datei geöffnet und jede Zeile gelesen.
    Die Zeilen sind wie folgt formatiert:
    Name;Vorname;Vorwahl;Telefonnummer;
    Für jeden Eintrag reserviere ich neuen speicher und zerlege dann die Zeile mit strtok.
    Am Ende des einlesens wird dann jeder Eintrag an das Telefonbuch angehängt (append).

    Das Problem ist nun folgendes:
    Wenn ich anschließend die Liste mit der Print Funktion ausgeben will, wird mir immer der letzte Nachname und ein Chaos danach angezeigt.

    name: Kohlhage vorname:  vorwahl: !►a∟↑@ nummer:
    name: Kohlhage vorname:  vorwahl: ►a∟↑@ nummer: ^Ì"
    name: Kohlhage vorname:  vorwahl:  nummer: a∟↑@
    name: Kohlhage vorname:  vorwahl:  !►a∟↑@ nummer: ↑@
    name: Kohlhage vorname: age vorwahl:  nummer: ►a∟↑@
    name: Kohlhage vorname:  vorwahl: Ì" nummer: Ð"
    name: Kohlhage vorname: e vorwahl:  nummer: ↑@
    name: Kohlhage vorname:  vorwahl:  nummer: ↑@
    name: Kohlhage vorname: ge vorwahl:  nummer: ∟↑@
    name: Kohlhage vorname: Mar vorwahl: @ nummer: h♠ Ð"
    name: Kohlhage vorname: r vorwahl: ►a∟↑@ nummer: ^Ì"
    name: Kohlhage vorname: e vorwahl:  nummer: ↑@
    name: Kohlhage vorname: e vorwahl:  nummer: ∟↑@
    name: Kohlhage vorname: ar vorwahl:  nummer: ∟↑@
    

    Auch in der Testausgabe die in der append-Methode aufgerufen wird, gibt es schon Probleme:
    Der Vorgänger ist angeblich der aktuelle Nachname mit verstümmelten Restwerten, der aktuell einzufügende Eintrag wird jedoch richtig angezeigt.

    Ich würde mich sehr freuen, wenn mir jemand helfen könnte, meine Denkfehler auszuräumen.
    Schöne Grüße
    Alex



  • Ohne den Code im Detail angeschaut zu haben: Das Problem ist, dass du die Token (also die Strings) von strtok nicht kopierst, sondern nur die Zeiger zuweist. Die Zeigen aber immer wieder auf den Buffer 'line' welcher in deiner Schleife eh immer überschrieben wird, und zusätzlich nach dieser ohnehin nicht mehr gültig ist.
    Abhilfe: Du kopierst immer gleich die Token (strcpy) nachdem du für die Memberzeiger (nachname, vorname, etc.) Speicher der Länge der jeweiligen Token reserviert hast. Dazu baust du dir am besten die Non-standard-Funktion 'strdup' nach (oder wenn du unter einem POSIX-System bist halt gleich strdup benutzen).



  • Wow, das ging ja schnell...
    Herzlichen Dank für die Antwort, das war tatsächlich das Problem!!!


Anmelden zum Antworten