Verzeichnisbaum darstellen
-
weiß nicht ob ich hier im richtigen Bereich bin(da die posix-funktionen auf unix systemen gibt?)
also wir sollen einen verzeichnisbaum auf der konsole anzeigen, allerdings mit einer bestimmten formatierung, woran ich eben scheitere:
vorerst mal die tree funktion, der rekursiv opendir aufruft:
void tree(char *path, int level) { struct dirent *direntry; DIR *directory; chdir(path); //in neues Verzeichnis wechseln directory=opendir("."); if(directory) { while((direntry=readdir(directory)) != 0) { if(strcmp(direntry->d_name, ".") != 0 && strcmp(direntry->d_name, "..") != 0) { if(strlen(direntry->d_name)>PATH_MAX) printf("path name is too long\n"); if(direntry->d_type==DT_DIR) { printf("%s|---[%s]\n",writer(level+1),direntry->d_name ); tree(direntry->d_name,level+1); } else printf("%s|---[%s]\n", writer(level), direntry->d_name ); } } closedir(directory); } }
und hier die eigentliche formatierfunktion:
char* writer(int level){ const char *postfix = "| "; char *result = ""; int i=0; for(i=level;i>0;i--) strcat(result,postfix); return result; }
so in etwa müsste die ausgabe aussehen:
[/home/bes3/workspace/gcc/] |---[Math/] | |---[Math] | |---[qt_temp.SZ5707] | |---[qt_temp.Co5707] | |---[Math.c] |---[c_test_prog/] | |---[main.c] | |---[Print.h] | |---[Test.h] | |---[main.c~] | |---[Test.c] | |---[Übung2/] | | |---[main.c]
allerdings sehe ich bei mir garnichts, weil ich einen segmentation fault (weiß nicht einmal was das ist). kann mir vllt da jemand weiterhelfen?
-
char *result = ""; // result zeigt auf das Stringliteral "" int i=0; for(i=level;i>0;i--) strcat(result,postfix); // hier möchtest du etwas an ein Stringliteral anhängen.
Stringliteral sind konstant. D.h sie dürfen nicht verändert werden.
Strings sind in C nicht dynamisch. D.h. ihre länge wird nicht automatisch dem Bedarf angepasst.
Darum muss sich der Programmierer kümmern.ACnut schrieb:
weil ich einen segmentation fault (weiß nicht einmal was das ist).
Aber Wikipedia weiß das. Und die ist gerne bereit das Wissen mit dir zu teilen.
-
segmentation fault=zugriffsverletzung
also provisorisch funktioniert es schon mal so:
char* writer(int level){ const char characters[] = "| | | | | | | "; char result[40] = ""; return strncat(result, characters, level*4); }
aber wenn ich die berechnung manuell und passend (hoffe ich zumindest), dnan werden da irgendwelche falschen zeichen gesetzt:
char* writer(int level){ const char characters[] = "| "; int length=strlen(characters)*sizeof(characters)*level; char result[length]; result[0]="\0"; //so wie ich das sehe liegt das problem hier mit der // null-terminierung denn wenn ich das beim obigen beispiel auch mache, kriege // ich wieder diese falschen "füllzeichen" for(level;level>0;level--) strcat(result, characters); return result;
was genau passt da nicht? arraygröße?,...?
-
Das Problem ist, dass result ein lokales Array ist und du ja nur den Zeiger auf dieses Array zurück gibst.
Mit dem Verlassen der Funktion, werden die lokalen Variablen aber ungültig.
Der Speicher wird wieder von anderen Variablen genutzt.
Du hast jetzt also eine ungültige Adresse.Mach die Ausgabe gleich in
writer
.
Oder übergib anwriter
ein Array mit genug Platz.
-
oh ok danke