2017-11-27 3 views
-4

Wir müssen einen Binärbaum erstellen, der Inhalt von Textdateien enthält. Die Zeiger selection_a und selection_b zeigen auf eine andere Textdatei im Verzeichnis.Rekursiver Binärbaum gibt Speicherzugriffsfehler

Die Struktur der Text-Dateien folgt: 1. Zeile: Titel 2. Zeile: Optiona 3. Zeile: OptionB 4. - n. Linie: Text.

Die erste Datei wird beim Starten des Programms als Parameter angegeben. Alle Dateien sollten am Anfang des Programms gespeichert werden. Dann wird der Text der ersten Datei angezeigt, und Benutzer kann A oder B eingeben, um fortzufahren. Anhand der Auswahl wird der Text der Dateioption A/B angezeigt und er kann erneut entscheiden.

Die letzte Datei eines Baumes enthält keine Optionen: 2. und 3. Zeile sind "- \ n".

Das Problem ist, liest dieser Code nur alle Option A-Dateien der ersten Struktur. Es liest nicht in irgendwelchen B-Wahlen. Am Ende zeigt das Programm einen Speicherzugriffsfehler.

Ich weiß, dass der Code irgendwie kootisch sein kann, aber wir sind Anfänger in der Programmierung. Hoffe, dass jeder helfen kann. Hier ist der Code:

struct story_file 
{ 
    char *title; 
    char *text; 
    struct story_file *selection_a; 
    struct story_file *selection_b; 
}; 
+1

Lernen [ wie Sie Ihr Programm debuggen können (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) und ein [MCVE] erstellen. – iBug

+1

'strcat (Dateiname, txt);' ist falsch, da Dateiname 'auf' argv [1] 'zeigt, die möglicherweise nicht groß genug ist, um" .txt "anzuhängen. –

+0

'char ch = getc (input);' muss 'int ch = getc (input);' sein, um mit EOF vergleichen zu können. –

Antwort

2

In readingRows() Ihnen zugeordneten String haben wörtliche current->text

current->text = ""; 

Jetzt current->text lesen hält nur String und Sie ändern es in strcat()

current->text = strcat(current->text,lines); 

Dies führt zu undefiniertem Verhalten

1

Ihr Hauptproblem ist in current->text

Zuerst Sie es current->text = ""; gesetzt, die es auf die leere Zeichenfolge (und einem Nur-Lese-wörtliche) Punkt macht. Sie sollten es auf Null gesetzt:

current->text = 0; 

Dann Sie Text, um ihn anhängen wollen, aber vergessen Speicher dafür zuzuweisen:

current->text = strcat(current->text,lines); 

Sie tun sollten:

int currlen, linelen; 
linelen= strlen(lines); 
if (current->text) currlen= strlen(current->text); else currlen= 0; 
char *newtext= malloc(currlen+linelen+1); 
if (current->text) strcpy(newtext, current->text); else *newtext= 0; 
strcat(newtext, lines); 
if (current->text) free(current->text); 
current->text= newtext;