String als Rückgabe
-
Hallo.
Will eine Routine schreiben, welche mir einen Pfad nach dem letzten "/" durchsucht und dann den String bis zu diesem Zeichen (inkl.) zurückgibt. Folgender Code ist dabei heraus gekommen:
//Funktion listet den String von 0 bis StringLength auf. int GetMeshFilePath(char ** Path, char * filename){ unsigned long StringLength=PathLength(filename)+1, fi=0; char fPath[StringLength]; for(fi=0;fi<StringLength;fi++){fPath[fi]=filename[fi];} fPath[StringLength]='\0'; *Path = fPath; return StringLength; } //Funktion sucht nach dem letzten '/' im String und gibt die Stelle als int zurück int PathLength(char * filename){ unsigned long fi=strlen(filename)-1; do{ if(filename[fi]=='/'){return fi;} }while(fi-->=1); return -1; }
Der Code funktioniert, wenn ich vor return StringLength ein printf("%s\n", fPath); einfüge. Aber wenn ich diese Funktion aufrufe, läuft die Rückgabe nicht richtig. Das sollte eigentlich wie folgt aussehen:
/*filename beinhaltet den Pfad auf eine *.dat Datei*/ int main(){ //... //... char * Path=NULL; unsigned int PathLength=GetMeshFilePath(&Path, filename); //... //... printf("Path: %s\n", Path); return 0; }
Auf meinem Bildschirm wird ein mir nicht bekanntes Zeichen ausgegeben.
-
Durch das
*Path = fPath;
läßt du Path auf ein lokales Array zeigen, das nach dem verlassen/beenden von GetMeshFilePath nicht mehr gültig ist.Abbhilfe: Übergib an GetMeshFilePath einfach einen Speicherbereich der groß genug ist.
Schau dir mal strrchr an. Das Beispiel da passt schon fast.
-
Hallo DirkB,
danke. Hab es gelöst.
char * fPath = (char *)calloc(StringLength, sizeof(char)); // statt char fPath[StringLength];
Dann kann der Bereich auch übergeben werden. Danke, Dein Hinweis hats klicken lassen
-
Keine gute Idee, denn dann musst du auch an das free denken.
Für Pfade gibt es in irgendeinem Systemheader auch ein Makro für die Maximallänge.
-
...aber der Wert wird an die main zurückgegeben. Den Pfad brauche ich ohnehin bis zum Ende des Programms.
-
DirkB schrieb:
Für Pfade gibt es in irgendeinem Systemheader auch ein Makro für die Maximallänge.
MAX_PATH
-
volkard schrieb:
MAX_PATH
Auch unter Unix (wegen dem '/') und in welchem Header?
-
Schau dir mal die Funktion basename.
Die verändert allerdings den Ursprungsstring.
-
DirkB schrieb:
volkard schrieb:
MAX_PATH
Auch unter Unix (wegen dem '/') und in welchem Header?
Ach, benutzt hab ich das zuletzt unter Win95.
Jetzt isses http://www.cplusplus.com/reference/cstdio/FILENAME_MAX/