string in string formatieren?



  • kimmi schrieb:

    Schau dir mal stringstreams an:
    http://cplus.kompf.de/artikel/stream4.html

    Gruß Kimmi

    😃 http://cplus.kompf.de/artikel/container.html Immer die passenden Bildchen, aber warum gibt es hier http://cplus.kompf.de/artikel/strings.html plötzlich keines mehr? 😃



  • lord_fritte schrieb:

    Ja schon, aber was ist wenn der puffer nicht ausreicht?

    Wie meinst du das genau? Wenn du einen std::string erzeugst, brauchst du dir kaum um die Grösse des Speichers Sorgen zu machen. Falls es wirklich kritisch sein sollte, kannst du immer noch mit max_size() prüfen.



  • Nexus schrieb:

    lord_fritte schrieb:

    Ja schon, aber was ist wenn der puffer nicht ausreicht?

    Wie meinst du das genau? Wenn du einen std::string erzeugst, brauchst du dir kaum um die Grösse des Speichers Sorgen zu machen. Falls es wirklich kritisch sein sollte, kannst du immer noch mit max_size() prüfen.

    Ne ich meine wenn ich da smit einem char* machen würde, da könnte ich ja einfach sprintf benutzen.

    Wie kann ich eigentlich eine eigene Funktion mit offener parameterliste schreiben?

    Gibt es eigentlich eine Funktion mit der ich alles mögliche in einen String konvertieren kann?

    also ich stopfe da z.b. einen int, float, double, etc. rein und bekomme diesen als string zurück.



  • lord_fritte schrieb:

    Ne ich meine wenn ich da smit einem char* machen würde, da könnte ich ja einfach sprintf benutzen.

    Benutz in C++ besser nicht sprintf() , diese Funktion ist nämlich fehleranfällig und nicht typsicher.

    lord_fritte schrieb:

    Wie kann ich eigentlich eine eigene Funktion mit offener parameterliste schreiben?

    Davon ist ebenfalls abzuraten (unter anderem auch wegen mangelnder Typsicherheit). In C++ besteht normalerweise kein Anlass zu einer variablen Parameterliste.

    lord_fritte schrieb:

    Gibt es eigentlich eine Funktion mit der ich alles mögliche in einen String konvertieren kann?

    also ich stopfe da z.b. einen int, float, double, etc. rein und bekomme diesen als string zurück.

    Es gibt die Klasse std::stringstream , mit der man bequem formatieren und von Strings zu anderen Typen und zurück umwandeln kann. Auf www.cplusplus.com findest du dazu mehr Informationen.



  • Nexus schrieb:

    lord_fritte schrieb:

    Ne ich meine wenn ich da smit einem char* machen würde, da könnte ich ja einfach sprintf benutzen.

    Benutz in C++ besser nicht sprintf() , diese Funktion ist nämlich fehleranfällig und nicht typsicher.

    Nicht zwingend.

    lord_fritte schrieb:

    Wie kann ich eigentlich eine eigene Funktion mit offener parameterliste schreiben?

    http://en.wikipedia.org/wiki/Stdarg.h

    Eine überlaufsichere String-Version von sprintf sieht so aus:

    std::string str_printf (const char* format, ...)
    {
        using namespace std;
    
        std::va_list args;
        std::string retval;
    
        va_start (args, format);
        retval.resize (vsnprintf (0, 0, format, args));
        vsnprintf (&retval[0], retval.size () + 1, format, args);
        va_end (args);
    
        return retval;
    }
    


  • audacia schrieb:

    Nicht zwingend.

    Doch, fehleranfälliger als std::stringstream ist sie. Das heisst ja nicht, dass man damit zwangsläufig Fehler macht.

    Aber warum empfiehlst du ihm solche Sachen, wenn es doch mit std::stringstream so einfach geht? Performance kann ja hier kein Kriterium sein. Auch die variable Parameterliste wird nicht ohne Grund kaum mehr in C++ verwendet. Er wird damit früher oder später Probleme haben, besonders, wenn er noch nicht so gewandt in C++ ist.

    Es kann nicht schaden, die beiden Konstrukte zu kennen, aber ohne wirklich guten Grund würde ich sie nicht einsetzen.


  • Administrator

    Und ansonsten wirklich wenn schon Boost.Format verwenden, welches schon von "Tippgeber" empfohlen wurde:
    http://www.boost.org/doc/libs/1_38_0/libs/format/index.html

    Boost.Format unterstützt auch eine Art von variabler Parameterliste. Sie wird einfach über überladene Operatoren erreicht. Das macht sie typsicher, überlaufsicher und es können auch komplexe Objekte übergeben werden.

    Grüssli



  • Nexus schrieb:

    audacia schrieb:

    Nicht zwingend.

    Doch, fehleranfälliger als std::stringstream ist sie.

    Das schon, aber nicht grundsätzlich und unbehebbar fehleranfällig und typunsicher. Und es ist ja nicht so, als hätte sprintf keinerlei Vorteile.

    Nexus schrieb:

    Aber warum empfiehlst du ihm solche Sachen, wenn es doch mit std::stringstream so einfach geht? Performance kann ja hier kein Kriterium sein. Auch die variable Parameterliste wird nicht ohne Grund kaum mehr in C++ verwendet. Er wird damit früher oder später Probleme haben, besonders, wenn er noch nicht so gewandt in C++ ist.

    Für und Wider wurden hier ausführlich breitgetreten.



  • audacia schrieb:

    Das schon, aber nicht grundsätzlich und unbehebbar fehleranfällig und typunsicher. Und es ist ja nicht so, als hätte sprintf keinerlei Vorteile.

    Spätestens im Zusammenhang mit Objekten und Klassen sehe ich schon gravierende Nachteile.

    cu André



  • lord_fritte schrieb:

    Ich habe verschiedene parameter, int, short, strings und daraus möchte ich einen String erzeugen.

    The right tool for the right problem[/knivil] 😉


  • Administrator

    audacia schrieb:

    lord_fritte schrieb:

    Ich habe verschiedene parameter, int, short, strings und daraus möchte ich einen String erzeugen.

    The right tool for the right problem[/knivil] 😉

    std::string Objekte mit sprintf , das könnte recht ineffizient werden. Gerade wegen den strings, würde ich eher std::stringstream als "the right tool" ansehen. Auch wenn es String-Literale sind, würde ich immer noch std::stringstream als besseres tool sehen, da man über die Templates sich ein strlen ersparen kann.

    Aber naja, ich glaube wir sind uns inzwischen einig, dass wir uns nicht einig sind 🙂

    Grüssli



  • audacia schrieb:

    Nexus schrieb:

    audacia schrieb:

    Nicht zwingend.

    Doch, fehleranfälliger als std::stringstream ist sie.

    Das schon, aber nicht grundsätzlich und unbehebbar fehleranfällig und typunsicher. Und es ist ja nicht so, als hätte sprintf keinerlei Vorteile.

    Welche Vorteile hat es denn?


Anmelden zum Antworten