return string nach std::transform(...)



  • Hallo everybody,

    ich habe folgende Funktion geschrieben, die mir von einem Dateinamen die filename extension abtrennt und zurückgibt

    std::string GetFileExtension(std::string filename)
    {
        ///     VARIABLES
        ///-------------------------------------------------------------------------------------
        short int j=filename.size();
        std::string file_extension;
        ///-------------------------------------------------------------------------------------
    
        ///     CODE
        ///-------------------------------------------------------------------------------------
        while(filename[j-1]!='.')
        {
            j--;
        }
    
        file_extension=std::string(filename.begin()+j, filename.end());   /* getting file extension */
        /* making everything lower case */
        std::transform(file_extension.begin(), file_extension.end(), file_extension.begin(), ::tolower);
        return file_extension.c_str();
        ///-------------------------------------------------------------------------------------
        ///     END
    }
    

    Aufruf erfolgt in einer anderen Funktion per

    std::string temp_str;
    temp_str=GetFileExtension(itr->path().filename().string());
    

    itr ist ein boost::filesystem::directory_iterator.

    Meine Frage ist jetzt, warum muss ich in der Funktion GetFileExtension den string mit file_extension.c_str() zurückgeben (hab's nur durch Probieren erraten)? Ohne ".c_str()" meldet sich der Debugger* beim durchsteppen mit

    Cannot open file: ../../../../src/gcc-4.7.1/libgcc/unwind-sjlj.c
    At ../../../../src/gcc-4.7.1/libgcc/unwind-sjlj.c:127
    

    Kann mir das jemand erklären, was std::transform an meinem String zu ändern scheint? Google konnte mir bis jetzt auch nicht wirklich helfen 😞

    * hier stand vormals Compiler


  • Mod

    Dein Problem hat nichts mit der Sprache C++ zu tun, ohne .c_str wäre auch korrekt.

    Es ist auch keine Fehlermeldung vom Compiler, das Programm wird korrekt übersetzt. Es klingt eher nach einer Meldung seitens eines Debuggers.

    Ich würde an deiner Stelle einfach mal Google zu dieser Art Meldung befragen, vermutlich liegt irgendeine Art von Fehlkonfiguration deiner Entwicklungsumbegung vor.



  • SeppJ schrieb:

    Es ist auch keine Fehlermeldung vom Compiler, das Programm wird korrekt übersetzt. Es klingt eher nach einer Meldung seitens eines Debuggers.

    Das erklärt natürlich warum es nur beim Debuggen auftritt 😃

    Wie gesagt hat mir google nichts dazu geliefert. Sonst noch jemand ne Idee 😕


  • Mod

    Maisinator schrieb:

    Wie gesagt hat mir google nichts dazu geliefert.

    Es liefert natürlich nur etwas, wenn man auch sucht.



  • schon auf die ide gekommen das die datei ../../../../src/gcc-4.7.1/libgcc/unwind-sjlj.c halt einfach nicht auf deinem Rechner ist?

    das ist kein Fehler, der Debugger findet halt einfach nicht den Sourcecode vom entsprechenden Code den er ausführt und sagt er kann nicht in die Datei rein steppen.
    das ist nicht sonderlich fruchtbar da du in unwind-sjlj.c eh nichts findest was dich betrifft. ist eine datei aus libgcc, siehe https://github.com/gcc-mirror/gcc/blob/master/libgcc/unwind-sjlj.c

    Interessantere Fragen wären:
    warum const std::string& filename eine nettere Funktion Signatur gibt
    warum du keine eigene loop zum finden des letzten Punkts nehmen solltest sondern std::string.find_last_of



  • kurze_frage schrieb:

    schon auf die ide gekommen das die datei ../../../../src/gcc-4.7.1/libgcc/unwind-sjlj.c halt einfach nicht auf deinem Rechner ist?

    das ist kein Fehler, der Debugger findet halt einfach nicht den Sourcecode vom entsprechenden Code den er ausführt und sagt er kann nicht in die Datei rein steppen.
    das ist nicht sonderlich fruchtbar da du in unwind-sjlj.c eh nichts findest was dich betrifft. ist eine datei aus libgcc, siehe https://github.com/gcc-mirror/gcc/blob/master/libgcc/unwind-sjlj.c

    Interessantere Fragen wären:
    warum const std::string& filename eine nettere Funktion Signatur gibt
    warum du keine eigene loop zum finden des letzten Punkts nehmen solltest sondern std::string.find_last_of

    Super vielen Dank. Dann werde ich mir heute abend mal das mit der Datei angucken.

    Die Fragen sind in der Tat interessant. Warum? 😃

    Ich bin erst kürzlich zu C++ gewechselt und hatte vorher an der Uni auch nur eine Einführung in C wo eig nur die Basics Schleifen, If-Else etc in uns reingeprügelt wurden, daher bin ich für jeden Tipp dankbar 😉


Log in to reply