std::string frage?
-
Wie kann ich den String formatieren? al'a sprintf ???
-
falls du msvc benutzt, nimm doch CString. die CString-klasse hat eine 'Format' funktion ähnlich wie sprintf.
-
Die Syntax ist zwar etwas anders als bei der printf()-Familie, aber ich würde stringstream's empfehlen.
-
Es gibt außerdem bei boost noch was zum Formatieren von strings in printf-Art.
-
BorisDieKlinge schrieb:
Wie kann ich den String formatieren? al'a sprintf ???
Ehrlich gesagt, ist die Frage schon falsch. printf() "formatiert keinen String", sondern "bringt Daten mittels eines Formatstrings zur Ausgabe". Bei sprintf() wird diese Ausgabe in einen (neu erzeugten) string geleitet ... und genau das tut std::stringstream (eleganter und sicherer als printf()) .
Gruß,
Simon2.
-
@boris
#include <iostream> #include <string> #include <stdarg.h> std::string formatted_str (char *fmt, ...) { static char buff[512]; // muss reichen va_list args; va_start (args, fmt); vsprintf (buff, fmt, args); va_end (args); return std::string(buff); } int main() { std::cout << formatted_str("Hello %p %04x %s\n", main, 1000, "world"); }
-
cool...
aber ist nimm glaub lieber sstream;)
-
Apeman schrieb:
static char buff[512]; // muss reichen
vsprintf (buff, fmt, args);
http://msdn2.microsoft.com/en-us/library/1kt27hek(VS.80).aspx
-
Apeman schrieb:
... static char buff[512]; // muss reichen ...
Ein besseres Argument für die Verwendung von streams gibt's wohl nicht.
Gruß,
Simon2.
-
Naja, so würde es noch gehen, ist nur halt nicht typsicher:
std::string formatted_str (char *fmt, ...) { unsigned int size = _vscprintf( fmt, (va_list)(&fmt+1) ) + 1; char* msg = (char*)malloc( size ); _vsnprintf( msg, size, fmt, (va_list)(&fmt+1) ); std::string ret = msg; free( msg ); return ret; }
-
Simon2 schrieb:
Apeman schrieb:
... static char buff[512]; // muss reichen ...
Ein besseres Argument für die Verwendung von streams gibt's wohl nicht.
klick mal auf den link über deinem posting
-
Ja, vsnprintf() ist ein wenig sicherer, aber die Längenbeschränkung ist trotzdem ärgerlich (und außerdem ist es afaik nicht portabel - genauso wie Badestrand's Ansatz).
-
@Badestrand! Mir fällt auf den ersten Blick nur das ein: Boh! Was für ein Chaos!
Neee, also String-Streams sind schon ne feine Sache.
-
Artchi schrieb:
@Badestrand! Mir fällt auf den ersten Blick nur das ein: Boh! Was für ein Chaos!
Jo, da haste auch Recht
Ich finde halt die Art des formatierens ("%s %i") ne Ecke schöner und übersichtlicher als "<< blablabla.getText()". Nichtsdestotrotz darf man auf Typsicherheit natürlich nicht verzichten, den Code hab ich auch nur aus irgendeiner uralten Schnipsel-Sammlung ausgegraben
-
Apeman schrieb:
Simon2 schrieb:
Apeman schrieb:
... static char buff[512]; // muss reichen ...
Ein besseres Argument für die Verwendung von streams gibt's wohl nicht.
klick mal auf den link über deinem posting
Ja - und ?
Wenn schon jemand, der den Beispielcode schreibt, das falsch macht, spricht das IMHO nicht für diese Lösung.
Gruß,
Simon2.
-
Badestrand schrieb:
...Ich finde halt die Art des formatierens ("%s %i") ne Ecke schöner und übersichtlicher als "<< blablabla.getText()"....
Das liegt dann aber höchstens daran, dass Du "C-verbogen" bist.
Den allermeisten Programmierern dürfte die "<<"-Notation übersichtlicher und sprechender sein als auswendig zu lernende "Formatkennzeichner".Gruß,
Simon2.
-
Simon2 schrieb:
Das liegt dann aber höchstens daran, dass Du "C-verbogen" bist.
Das ist gut möglich, ja
Allerdings sind wohl eher die Stream-Formatierungsoptionen ein Graus:
std::string name = "Badestrand"; double age = 99.97; printf( "%s ist %.4f Jahre alt", name.c_str(), age ); versus(); std::cout << name << " ist " << std::setiosflags(std::ios::fixed) << std::setprecision(4) << age << " Jahre alt";
Naja, ist mir das obige halt lieber.. Aber das ist Geschmackssache (und ich hab in mehreren Dingen einen komischen Geschmack), ich will auch keine Diskussion darüber anfangen und vor allem will ich nicht meinen Namen wechseln müssen
-
Na, wer unbedingt die %-Notation braucht, kann auch http://www.boost.org/libs/format/index.html benutzen.
-
Simon2 schrieb:
Den allermeisten Programmierern dürfte die "<<"-Notation übersichtlicher und sprechender sein als auswendig zu lernende "Formatkennzeichner".
die allermeisten programmierer stellen sich unter '<<' einen links-shift vor
...und diese formatkennzeichner sind auch nicht schwieriger zu merken als die ganzen ios_base::fmtflags und was noch alles zu C++ streams dazu gehört.
Badestrand schrieb:
...ich will auch keine Diskussion darüber anfangen und vor allem will ich nicht meinen Namen wechseln müssen
angsthase - pfeffernase - morgen kommt der osterhase
-
Apeman schrieb:
die allermeisten programmierer stellen sich unter '<<' einen links-shift vor
Der heisst in C++ aber auch stream insertion operator. Wenn man das weiss, stellt man sich darunter nicht zwangsläufig einen Links-Shift vor. Zumal das nicht der einzige Operator wäre, der je nach Kontext eine andere Bedeutung hat.