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/


Anmelden zum Antworten