Strings zusammensetzen
-
Abend,
ich muss in meinem Code recht häufig strings aus variablen zusammensetzen. Im Moment mach ich das, indem ich immer wieder lokal ein std::stringstream anlege:
stringstream s; s << "could not load file " << filename << number << "."; func(s);
Nur wird das langsam lästig. Was ich gerne hätte wäre ein Einzeiler, wie zB. sowas:
func("could not load file " << filename << "bla");
Wie könnte man das am besten machen? Auch der Einsatz eines Singletons oder Makros wäre für mich in Ordnung!
-
warum nimmst du nicht strcat ?
-
Kannst du das nicht einfach so machen
string1 += string2;
Oder es gibt doch noch die Methode string.insert().
-
Also dann:
Bei strstream
func(stringstream(str1 + "fsdfsd" + str2))
bei string
func(str1 + "hsdf" + str2)
Viel kürzer.
-
Oh man, eure "Vorschläge" tun mir richtig weh. Was soll ich bitte mit der unflexiblen Funktion strcat, wenn ich ints, floats usw in den String schreiben will? Und was zur Hölle soll der Vorschlag mit "string1 += string2;"? Ich kann in einen std::string nicht so einfach einen int oder float draufaddieren. Und der größte Schwachsinn kam dann von "Physik0r" (der Name sagt wohl alles). Das ist sowohl vom Design als auch syntaktisch totaler Schwachsinn. Das kompiliert ja nicht mal.
Naja, habs jetzt selber gelöst.
-
Wo hast du bitte gesagt, dass du ints und floats anfügen willst?
Mein Code kompiliert, solange du strings addierst.
Der +-Operator liefert string temporär zurück, und den übergibst per copy der Funktion. Was ist an dem falsch:func(4 + 6); int r, x; func(r + x); string a = "x"; string c = "o"; func(a + c);
Schönheit ist eine andere Sache, aber schlimm ist func(a + "hoho") nun wirklich nicht.
Schön, dass du allen die Lösung erzählst. Schön dass du Vorurteile gegen Physik0rs hast.
-
Dein Code is so sehr am Ziel vorbei, dass ich keine Lust hab groß drauf einzugehen. Ich sagte im ersten Post, dass ich Variablen verarbeiten musst. Und im Beispiel heißt eine Variable "number" Da hätte man sich ja wohl denken können, dass das nicht nur strings sind.
Zu deinem Müll Code:
func(stringstream(str1 + "fsdfsd" + str2))
Ich will nicht dutzende Strings anlegen. Da kann ich auch gleich einen stringstream benutzen. Wieso sollte ich die string erst konkatenieren und dann den fertig konkatenierten string in einen stringstream umwandeln?
Der Code kompiliert nicht, da stringstream nicht implizit in einen string castbar ist.
func(a + "hoho" + 2 + 3.14) geht nicht.
Wieso postet ihr alle, wenn ihr die Frage offenbar nichtmal richtig verstanden habt...Was an deinem Kiddienick mit der "0" lächerlich ist, dürfte offensichtlich sein.
Gelöst habe ich es mit vsprintf_s. Diskussion für mich beendet.
-
"ich muss in meinem Code recht häufig strings aus variablen zusammensetzen."
und wieso musst du das?wären hier evtl klassen angebrachter?
und ggf ein überladener op<< ?naja - wenn du selbst ne lsg hast, dann hf damit... ^^
bb
-
He, warum funktioniert das:
int value = 777; cout << static_cast<std::ostringstream&>(std::ostringstream() << value << " Text").str() << endl;
777 Text
Aber hier ist der erste String eine Hex-Value???
int value = 777; cout << static_cast<std::ostringstream&>(std::ostringstream() << "Text " << value << " Text").str() << endl;
004B7094777 Text
-
frühamabend schrieb:
Gelöst habe ich es mit vsprintf_s. Diskussion für mich beendet.
Wo ist daran der Vorteil gegenüber einem
stringstream
?
Dann noch lieber mit Boost.Format.Grüssli
-
frühamabend schrieb:
Gelöst habe ich es mit vsprintf_s. Diskussion für mich beendet.
ololol
-
Um noch mehr beizutragen:
Schreib dir doch ne eigene Funktion mit variabler Anzahl von Argumenten (Stichworte va_list, va_start, va_end, ...).
-
Was der Standard für Strings zu bieten hat ist einfach Müll.
-
Hallöchen,
ich bin so frei, diesen Thread mal wieder zu beleben, weil mich das Thema
auch gerade beschäftigt. Da ich meine Log-Klasse gerade optimieren will,
hatte ich an Funktionen mit optionalen Parametern gedacht. Das mit va_start / va_list, so hab ich gelesen, sollte man wegen der Typenunsicherheit net verwenden. Außerdem wäre ne c++ - Umsetzung mir auch am liebstenIch hab mir nun folgendes Zusammengebastelt, was auch funktioniert:
#include <fstream> #include <sstream> using namespace std; void log(ostringstream &ss, string fname); int main(int argc, char **argv) { // Des ist bissl bloed log(static_cast<std::ostringstream&>(std::ostringstream() << "string " << 5 << " string " << 5.5454), "log\\error.log"); return 0; } void log(ostringstream &ss, string fname) { ofstream fout; fout.open(fname.c_str()); fout << ss.str(); fout.close(); }
Der Funktionsaufruf von log mit dem Cast gefällt mir allerdings net, weil ich
nicht jedesmal, wenn ich was loggen möchte, diesen Rattenschwanz reinschreiben möchte. Hat jemand ne Idee, wie ich das anderes lösen kann? Hab schon alle Streamklassen durch
-
boost::lexical_cast oder wenn du kein Boost benutzen willst
template<typename T> std::string lexical_cast(T const &t) { std::stringstream s; s << t; return s.str(); } // ... std::string s = "foo" + lexical_cast(10);
-
oh super danke .... die Idee mit dem Template ist echt gut. Funktioniert