strings in Array werden überschrieben
-
Hallo,
folgendes Problem plagt mich seit StundenIch will aus einer Textdatei die einzelnen zeilen in ein Array speichern.
Hier erstmal die Funktion:char** fillOperationList (FILE * script, int lines) { int i = 0; char cmdLine[256]; char** res = calloc(lines,256*(sizeof(char))); while (fgets(cmdLine,256,script) != NULL) { if(cmdLine[0] != '#') { /* test: ausgabe der zeile */ fprintf(stderr,"cmdline: %s\n",cmdLine); res[i] = cmdLine; ++i; } } for(i = 0;i return res;
lines wurden vorher gezählt, datei wurde ordnungsgemäß geöffnet. Hab ich alles getestet.
Problem:
bei einer Textdatei mit dem Inhalt
AAA
BBB
CCCist die Ausgabe:
cmdline: AAA
cmdline: BBB
cmdline: CCC
CCC
CCC
CCCaus irgendwelchen Gründen steht am Ende im gesamten Array nur die letzte Zeile.
hoffe jmd kann mir helfen.
-
hoppla
for schleife:
for (i = 0;i < lines;++i) { fprintf(stderr,"%s\n",res[i]); } return res;
-
Durch
res[i] = cmdLine;
kopierst du nicht den Inhalt von cmdLine.
res[i] verweist auf cmdLine.Und da steht am Ende des Einlesens die letzte Zeile drin.
Beim verlassen von
fillOperationList
ist der Speicherplatz von cmdLine allerdings ungültig, da es eine lokale Variable ist.Du brauchst ein Array mit Zeigern auf char und dann noch für jede gelesene Zeile Speicherplatz. Diesen kannst du dann allerdings in der Größe der aktuellen Zeile anpassen.
char** res = calloc(lines,sizeof(char*)); .... res[i] = calloc(lines,strlen(cmdLine)+1); strcpy(res[i],cmdLine);
Fehlerbehandlung und
free()
am Ende nicht vergessen.
-
wow danke hat funktioniert!
ich versteh zwar noch nicht genau warum dass nur so geht, aber ich werds mir nochmal genau anschauen.
-
grindar schrieb:
...ich versteh zwar noch nicht genau warum dass nur so geht, aber ich werds mir nochmal genau anschauen.
Vielleicht hilft es, wenn du das %s pei den printf in %p änderst (beim einlesen und ausgeben). Das gibt dir die Adresse (in Hexdarstellung aus).