mehrere strings zu einem zusammenfügen? HILFE ich kriegs nicht gebacken!



  • Hallo.
    Ich habe ein Problem:

    Ich habe 4 strings und möchte die zu einem großen zusammenfassen.

    Ich möchte aus den 4 strings eine ip zusammensetzen und das als ping befehl absenden...

    Also brauche ich am ende einen string der folgendermaßen aussieht:

    ping var1.var2.var3.var4

    Ich weiss leider nicht wie ich das mit c++ bewerkstelligen soll...

    Unter php würde das ganze so aussehen aber unter c++ funzt das leider nicht:

    $string = "ping " . $var1 . "." . $var2 . "." . $var3 . "." . $var4 . "";

    Bitte helft mir.



  • Wenn du std::string verwendest ist der +-Operator überladen:

    std::string s = std::string("bla") + "bla" + "asdf";
    


  • std::string huch = string1 + string2 + string3;

    so sollte es hinhauen...

    gruesse



  • also danke erstmal für die schnellen antworten.

    also wenn ich es mit + mache dann gibt der compiler (MS Visual C++ 6) diese meldung aus:

    error C2677: Binaerer Operator '+' : Kein globaler Operator definiert, der den Typ 'class std::basic_ostringstream<char,struct std::char_traits<char>,class std::allocator
    <char> >' akzeptiert (oder keine geeignete Konvertierung moeglich)

    #include<iostream>
    #include<string>
    
    string ping;
    
    //hier kommen die anderen variablen..
    
    int main() {
    
    //....
    
    ping = "ping " + seg1 + "." + seg2 + "." + seg3 + "." + seg4 + "";
    
    //....
    return 0;
    }
    


  • Hallo

    schau dir nochmal den Post von .filmor an

    bis bald
    akari



  • Wie schon gesagt, das erste muss in einen std::string-Konstruktor gepackt werden. Übrigens lässt sich das mit Stringstreams (die du ja scheinbar verwendest) auch lösen:

    #include <sstream>
    // ...
    
    std::stringstream s;
    
    str << "ping " << seg1 << '.' << seg2 << '.' << seg3 << '.' << seg4;
    
    s.str (); // == ping 123.213.123.123
    


  • Hallo,

    EDIT:
    bin ich lahm...

    Im Übrigen gibt es die VC++ 2005 Express Edition gratis zum Runterladen. Um Einiges besser (v.a. aktueller) als der VC6. Probier ihn doch mal aus. 🙂

    MfG

    GPC



  • ok danke habs hinbekommen

    @GPC: ich werds bei gelegenheit mal installieren



  • ach so...

    ich habe jetzt die variante von .filmor verwendet.

    Jetzt habe ich dazu eine frage:
    wenn ich das in einer schleife ausführen lasse, dann wird immer mehr drangehängt.

    Kann ich das irgendwie löschen lassen?

    s = "" funktioniert zwar in php aber hier nicht.
    Die funktion flush() die soweit ich weiss dafür gemacht ist variablen zu leeren funktioniert auch nicht (wenn das nicht richtig ist dann korrigiert mich bitte) .

    wie kann ich das bewerkstelligen das die variable gelöscht/geleert wird?



  • bifi5590 schrieb:

    wie kann ich das bewerkstelligen das die variable gelöscht/geleert wird?

    Du meinst wahrscheinlich die std::stringstream Lösung. Den stream-Inhalt kannst du hier ebenfalls über die Methode str() setzen.

    Beispiel:

    int main()
    {
        ostringstream iss;
        iss << "Hallo " << "Welt" << '!';
    
        cout << iss.str() << endl;
        iss.str(""); // leert den Stream.
        cout << iss.str() << endl;
    
        return 0;
    }
    

    Gruß Caipi



  • Um es nochmal zusammenzufassen: Es gibt std::string und std::ostringstream. std::strings kann ich wohl mit s = "" leeren, wobei s.clear() effizienter ist. Habe ich ein std::ostringstream, leere ich den mit s.str(std::string()). s.str("") geht auch, braucht aber möglicherweise mehrere Taktzyklen länger.

    Wenn es wirklich auf Performance ankommt, sollte man auch Konstrukte wie:
    s = s1 + s2 + s3 vermeiden. Effizienter wäre:

    s.clear();
    s += s1
      += s2
      += s3;
    

    Das vermeidet ein paar unnötige Allokationen. Aber in der Regel kann man die paar Taktzyklen verschmerzen zugunsten besserer Lesbarkeit des Codes.

    Tommi



  • Wird alles wegoptimiert...

    Wirklich lohnenswert wäre:

    string erg;
    erg.reserve(s1.size() + s2.size() + s3.size());
    erg = s1 + s2 + s3;
    


  • Nein.

    Deine Version mit reserve bringt nichts. Im Gegenteil. Es erzeugt eine unnötige Allokation.

    erg = s1 + s2 + s3;
    

    Bedeutet:
    operator+ für s1 und s2 (temporärer String)
    operator+ für den temporären String und s3
    operator=: verwerfe erg (also das, was mit reserve allokiert wurde) und ersetze das durch das Ergebnis des vorigen Ausdrucks.

    Ich habe es übrigens ausprobiert: Es ist sehr schwer, überhaupt Unterschiede zu messen. Ohne Optimierungsflags ist die Version mit reserve der klare Verlierer. Mit -O2 kann man das eher als Meßungenauigkeit abtun. Der klare Gewinner war eine Kombination aus unseren Varianten:

    std::string erg;
      erg.reserve(s1.size() + s2.size() + s3.size());
      erg += s1;
      erg += s2;
      erg += s3;
    

    Hier wird auch der Platz, der mit reserve allokiert wurde wirklich genutzt.

    Tommi



  • Danke an alle.

    ich habe jetzt die methode mit .str("") benutzt.

    auf jeden fall funnktioniert es jetzt! Nochmal danke an alle


Anmelden zum Antworten