fehlerhafte Werte im zweidimensionalen Array
-
Hallo,
ich habe eine Funktion geschrieben, welche eine Transitionstabelle einlesen soll. Klappt soweit alles ganz gut, zumindest wenn ich es direkt beim auslesen ausgebe. Sobald ích das Feld nochmals Ausgebe, steht dort nicht mehr das Richtige.
int initAutomat(string automat[ZEILEN][SPALTEN]) { char line[300]; int i, j; FILE *datei; datei = fopen("testAutomat.txt", "r"); if(datei != NULL) { for(i=0; i < ZEILEN; i++ ) { fgets(line, sizeof(line), datei); automat[i][0].wert = strtok(line, "\t"); printf("%s\t", automat[i][0].wert); for(j = 1; j < SPALTEN - 1; j++) { automat[i][j].wert = strtok(NULL, "\t"); printf("%s\t", automat[i][j].wert); } printf("\n"); } // Ausgabe Automat zur Kontrolle for(i = 0; i < ZEILEN; i++) { printf("\n"); for(j = 0; j < SPALTEN - 1; j++) printf("%s\t", automat[i][j].wert); } } else { printf("Automat konnte nicht initialisiert werden. Datei nicht gefunden oder fehlerhaft."); return -1; } return 1;
Das ist die Ausgabe von der Funktion. Wie man sehen kann, stimmen die Werte beim auslesen und werden auch an der entsprechenden Stelle im Array gespeichert. Aber wenn ich das Array dann nochmals ausgebe, erscheint die zweite Ausgabe. Entweder sehe ich was Triviales gerade nicht oder ich weiß auch nicht. Hat wer dafür eine Erklärung?
fkt fkt a b c q0 c1 c1 q0 c1 c1 q0 c1 c2 q0 trap c2 c2 0 trap ap c2 q0 trap p c2 q0 trap p c2 q0 trap c2
PS: Der Automat ist natürlich Murks. Ist nur zum testen schnell geschrieben.
-
Wie ist denn string definiert?
Als char* ?Hier
automat[i][0].wert = strtok(line, "\t");
weist duautomat[i][0].wert
nicht den Inhalt zu (den strtok gefunden hat) sondern den Zeiger auf die Fundstelle in line.Beim nächste lesen mit
fgets(line, sizeof(line), datei);
wird der Inhalt von line natürlich überschrieben. Somit verweist automat[i][0].wert auf einen anderen Inhalt.
-
Erstmal vielen Dank für die schnelle Antwort.
Stimmt, hatte ich garnicht bedacht, dass ich ja nur die Adresse zuweise.
Mein string ist so definiert.
typedef struct { char *wert; }string;
-
Jetzt brauchst du nur noch Platz für den Text.
malloc (oder calloc) ist dein Freund.Aber am Ende das free nicht vergessen.
-
Super. Funktioniert jetzt. Vielen Dank!
Grüße
-
Das ging ja schnell.
Hast du auch an die '\0' am Ende vom String gedacht?