Strings addition abkürtzen



  • Guck dir mal std::string an:
    http://www.cppreference.com/cppstring/index.html
    Für diese sind auch die Operatoren + und += für die Konkatenation überladen.



  • danke, auf die Idee, das die Operatoren überlagert wurden bin ich gar nicht gekommen. sry.

    Aber mal eine andere Frage (hoffe die ist nicht genauso blöd): kann ich strings casten? hab schon alles probiert (auch in std::string). Es sollte doch eigentlich mit einem static_cast gehen, oder irre ich mich da?



  • std::string ist eine Klasse und eine Variable dieser kann mit einem char-Array oder einem anderen std::string initialisiert werden:

    string s("Hallo");
    string s2(s);
    

    Wenn du das char-Array haben willst, kannst du dir einen const char* zurückliefern lassen von string:

    string s("Hallo");
    const char *cc = s.c_str();
    

    Ansonsten, wie bereits gesagt, in die Referenz gucken, da findest du alles was du brauchst und auch einige Beispiele zu den Funktionen.



  • Vellas schrieb:

    string s("Hallo");
    const char *cc = s.c_str();
    

    Damit erzeugst du jetzt aber keinen neuen C-String mit dem Inhalt, sondern kopierst nur den Pointer, was auch noch gefährlich ist:

    #include <iostream>
    #include <string>
    
    int main() {
        using namespace std;
        string test("Hallo");
        const char* p = test.c_str();
        test.erase();
        test = "viiiiiiiiieeeeeeeeeeeeeell zu lang";
        cout << "p:       " << static_cast<void*>(const_cast<char*>(p)) << endl
             << "c_str(): " << static_cast<void*>(const_cast<char*>(test.c_str())) << endl;
        return 0;
    }
    

    Ausgabe bei mir:

    p:       0x3e2514
    c_str(): 0x3e2534
    

    Du siehst, der Zeiger kann sich verändern. Deswegen eher so machen:

    string s("Hallo Welt!");
    char* p = new char[strlen(s.c_str()) + 1];
    strcpy(p, s.c_str());
    cout << p << endl;
    delete[] p;
    

    edit: Oder falls keine Kopie notwendig ist, immer c_str() aufrufen.

    mfg.



  • Dein Beispielprogramm ist übrigens ein Fall von undefiniertem Verhalten - p ist an der Stelle überhaupt nicht mehr gültig, wo du es ausgeben willst (und "cout<<p" dürfte irgendwelchen Speichermüll ausgeben).

    Übrigens hat std::string auch die Methode copy(), mit der du seine Daten (oder Teile davon) in einen eigenen char[]-Block kopieren kannst.



  • CStoll schrieb:

    Dein Beispielprogramm ist übrigens ein Fall von undefiniertem Verhalten - p ist an der Stelle überhaupt nicht mehr gültig, wo du es ausgeben willst (und "cout<<p" dürfte irgendwelchen Speichermüll ausgeben).

    Du meinst jetzt das zweite, oder? Aber warum ist p da nicht mehr gültig? Das versteh ich nicht ganz.

    Übrigens hat std::string auch die Methode copy(), mit der du seine Daten (oder Teile davon) in einen eigenen char[]-Block kopieren kannst.

    Cool danke! Kannte ich noch gar nicht.

    char* p = new char[test.size() + 1];
        p[test.copy(p, test.size())] = 0;
        cout << p << endl;
        delete[] p;
    

    mfg.



  • joomoo schrieb:

    CStoll schrieb:

    Dein Beispielprogramm ist übrigens ein Fall von undefiniertem Verhalten - p ist an der Stelle überhaupt nicht mehr gültig, wo du es ausgeben willst (und "cout<<p" dürfte irgendwelchen Speichermüll ausgeben).

    Du meinst jetzt das zweite, oder? Aber warum ist p da nicht mehr gültig? Das versteh ich nicht ganz.

    Ich meinte an der Stelle, wo du die Adressen abfragst. Strings reorganisieren gelegentlich ihren internen Speicherbereich (indem sie einen größeren Block anfordern und ihre Daten dorthin umkopieren), und dabei werden alle Pointer, Referenzen und Iteratoren ungültig, die etwas mit dem String zu tun haben (dazu gehören auch Pointer, die du per c_str() bekommen hast).



  • CStoll schrieb:

    joomoo schrieb:

    CStoll schrieb:

    Dein Beispielprogramm ist übrigens ein Fall von undefiniertem Verhalten - p ist an der Stelle überhaupt nicht mehr gültig, wo du es ausgeben willst (und "cout<<p" dürfte irgendwelchen Speichermüll ausgeben).

    Du meinst jetzt das zweite, oder? Aber warum ist p da nicht mehr gültig? Das versteh ich nicht ganz.

    Ich meinte an der Stelle, wo du die Adressen abfragst. Strings reorganisieren gelegentlich ihren internen Speicherbereich (indem sie einen größeren Block anfordern und ihre Daten dorthin umkopieren), und dabei werden alle Pointer, Referenzen und Iteratoren ungültig, die etwas mit dem String zu tun haben (dazu gehören auch Pointer, die du per c_str() bekommen hast).

    Ja genau das wollte ich Vellas doch zeigen?! 😕

    joomoo schrieb:

    Du siehst, der Zeiger kann sich verändern.

    Ich hab den Zeiger ja nur angezeigt und nicht dereferenziert, also noch nichts gefährliches. Damit wollte ich halt genau Zeigen, dass er ungültig wird.

    mfg.



  • danke für die ganzen antworten. Leider ist meine Frage immer noch nicht beantwortet. Ich wollte nicht einen String zu etwas anderen casten (hatte dafür die c_str funktion schon gesehen) sondern ein short zu einem string. Habe es folgendermaßen probiert:

    short a = 5;
    	string myString = string(static_cast<char>(a));
    

    kann mir jemand sagen, was daran falsch ist?





  • MaxDemian schrieb:

    danke für die ganzen antworten. Leider ist meine Frage immer noch nicht beantwortet. Ich wollte nicht einen String zu etwas anderen casten (hatte dafür die c_str funktion schon gesehen) sondern ein short zu einem string. Habe es folgendermaßen probiert:

    short a = 5;
    	string myString = string(static_cast<char>(a));
    

    kann mir jemand sagen, was daran falsch ist?

    Mit static_cast geht das nicht. Entweder du machst es so wie in der FAQ oder mit dem lexical_cast aus der boost C++ Library, der kann sowas:

    #include <iostream>
    #include <string>
    #include <boost/lexical_cast.hpp>
    
    int main() {
        using namespace std;
        using boost::lexical_cast;
        short a = 5;
        string b = lexical_cast<string>(a);
        cout << b;
        return 0;
    }
    

    mfg.



  • joomoo schrieb:

    edit: Oder falls keine Kopie notwendig ist, immer c_str() aufrufen.

    Genau davon bin ich eigentlich ausgegangen. Hatte irgendwie bissl vorausgesetzt, dass man darauf kommt, dass es sich dabei nicht um eine Kopie handelt. 🙂


Anmelden zum Antworten