C++ Alternative zu sprintf()
-
Hi, ich suche eine C**++** Alternative zu sprintf().
Wäre es guter Stil, wenn ich Strings (ich brauche ja char[]) mit dem + Operator zusammenfasse und dann caste?
MfG RoaN;
-
kommt drauf an, wofür du ein char array brauchst und ob du nicht lieber ganz auf std::strings umsteigen möchtest, dann kannst du auch stringstream ohne nerviges in-char[]-herumkonvertieren verwenden.
-
Ich verwende die WinApi, genauer: die MessageBox Funktion, da gibt's nunmal nur Char's
Das mit der Umwandlung kommt mir aber irgendwie komisch vor, sicher, dass es da nichts Anderes gibt?MfG RoaN;
-
nein, das war eigentlich mehr eine elegante anspielung auf die frage, ob du char* oder char const * brauchst.
da die messageboxes wahrscheinlich aber nur const chars brauchen, ist eh alles ok.#include <sstream> //... std::stringstream stream; stream << "Foo is " << foo << " and bar is " << bar; MessageBox (stream.str().c_str(), ...);
damit kannst du die normalen streammanipulatoren aus iomanip und eigene verwenden.
-
Das sieht hässlich aus.
-
Was sieht hässlich aus? Das .c_str(), oder das Speisen des Streams über den << Operator? Wenn dich letzteres stört, kannst du dir ja alternativ boosts Format library anschauen:
http://www.boost.org/libs/format/index.htmlAnsonsten musst du wohl weiter bei sprintf (besser: snprintf) bleiben
-
davie schrieb:
#include <sstream> //... std::stringstream stream; stream << "Foo is " << foo << " and bar is " << bar; MessageBox (stream.str().c_str(), ...);
Das Beispiel ist aber nicht ganz korrekt, da MessageBox (wie die meisten WinAPI Funktionen) TCHAR's handelt.
-
groovemaster schrieb:
Das Beispiel ist aber nicht ganz korrekt, da MessageBox (wie die meisten WinAPI Funktionen) TCHAR's handelt.
und ein TCHAR ist idR ein char, weil man meistens nicht mit Unicode kompiliert, wiel man damit in C meistens nur probleme hat.
aber wir wollen ja keine haare spalten, nicht?
-
Shade Of Mine schrieb:
und ein TCHAR ist idR ein char
Nein, ein TCHAR ist je nach Makrodefinition char oder wchar_t. Aber das weisst du ja selbst.
Wenn man schon vorhat, lediglich auf narrow chars zu setzen, dann sollte man auch wenigstens MessageBoxA verwenden. Damit macht auch die Unicode Compilierung keine Probleme.
-
Danke für die Antworten, ich benute dann mal das hässliche
stream.str().c_str()
.9
-
Obwohl, das hier wäre doch eigendlich kürzer und sieht auch gleich besser aus, oder?
string Text; Text = "Fo ist " + fo + "Bo ist " + bo; MessageBox(NULL,(char)Text,"Wichtige Informartion",MB_OK | MB_ICONINFORMATION);
-
Stimmt, der Stringstream ist praktischer, so wie's oben steht funktioniert es gar nicht
MfG RoaN;
-
(char)Text
böse. wenn std::string einen cast nach char*(nicht char, char ist ein einzelnen zeichen) unterstützen würde, so würde das sogar implizit geschehen, da das aber nicht der fall ist(dafür gibt es extra c_str()), macht dein code absoluten müll, vorallem da sring intern je nach implementierung nur pointer auf einen mit new angelegten speicherbereich hat, und somit eine konvertierung nach (char*) nur den speicherplatz dieser pointer und nicht den text betrifft.
-
War mir auch aufgefallen, habs dann auch mit .c_str() gemacht, doch das fand ich ja gerade so hässlich.
Jetzt hab ich mich an .c_str() gewöhnt und find es nicht mehr so schlimm
- und da das mit dem + GetMHZ() auch nicht funktioniert nehm ich wie gesagt lieber den stringstream.Vielen Dank für euere Hilfe.
MfG RoaN;
-
wenn du viel mit C APIs arbeitest ist std::vector<char> wohl besser als std::string geeignet.
-
Ne, ich installiere gerade schon GTKmm,
mich hatte diese Aussage: "Es gibt zu sprintf keine ..." aus, glaub es war ein Scherfgrn, diesem Buch nur stutzig gemacht.
Das mit der MessageBox war ein Beispiel-Teil aus diesem Buch.MfG RoaN;
-
roan312 schrieb:
mich hatte diese Aussage: "Es gibt zu sprintf keine ..." aus, glaub es war ein Scherfgrn, diesem Buch nur stutzig gemacht.
oben genannte stringstreams sind ja auch keine echte alternative. Die gibt es in C++ auch nicht. Boost wurde ja schon genannt.