String an char array Ende kopieren



  • Hi,
    Ich suche eine Funktion, möglichkeit eine Zeichenkette ans Ende eines char arrays zu kopieren. Mein C++ Buch hat dieß jedoch nochnicht behandelt.

    MFG ReduX



  • const char* concatenate(const char* cstr, std::string cppstr) {
       return (std::string(cstr) += cppstr).c_str();}
    

    Waere die "Eher-C++"-Variante (warum auch immer man nicht gleich nur std::strings verwendet...)

    char* buf = "Hello ";
    std::string cppstr("World");
    char* ergebnis = strcat(buf, cppstr.c_str());
    

    Waere die "Doch-Eher-C"-Variante (find ich pfui in C++ 😉 )



  • @pumuckl: sicher, das deine "Eher-C++"-Variante da nicht bumm macht?



  • Machen sie leider beide. Die erste, weil das temporäre String-Objekt, aus dem der char-Zeiger kommt, nach dem return verpufft, und damit der char-Zeiger ungültig wird. Die zweite, weil buf auf ein zu kleines Stück Speicher zeigt und noch dazu auf einen konstanten String. ergebnis ist übrigens danach == buf

    EDIT:
    Die Antwort auf die Fragestellung dürfte dennoch strcat lauten 😉



  • @LoadJaxom: Was passiert bei folgendem:

    std::string concatenate(const char* cstr, std::string const& cppstr) 
    { return (std::string(cstr) += cppstr); }
    
    int main()
    {
        std::string& res(concatenate("test1", " geht!"));
        std::cout << res.c_str() << std::endl; 
    }
    

    ?



  • Kompiliert das? Ich meine zumindest der g++ gibt eine Meldung a la "taking reference of temporary". Jedenfalls ist der String, an den die Referenz gebunden wird, nach dem kompletten Ausdruck tot.

    Die Lösung wäre, den String einfach als Kopie zu nehmen. Das erlaubt RVO und ist geradezu ideal für den Compiler auf eine Konstruktion und einen Aufruf von += zu optimieren.

    std::string res(concatenate("test1", " geht!"));
    


  • Warum dann nicht einfach gleich string("Hello ") + "World" ? Gut, ist keine Funktion, aber wenn man schon mit std::string rumhantiert, ist eine Funktion zur Verkettung ja überflüssig.


Anmelden zum Antworten