int an string anhaengen
-
Hi,
ich habe folgendes Problem. Ich möchte gerne einen int an einen String anhaengen.
aber es geht werder, wenn ichint zahl = 2; string x = "xxx" + zahl;
eingebe, noch wenn ich versuche, den int zuerst in einen string umzuwanddeln mit
string str_int << zahl;
Wie mache ich das blß richtig?
Danke schon mal
-
Gibt so ne Funktion itoa (), die dürfte dein Problem lösen...
-
Habe es mal ausprobiert, aber es tut nicht, obwohl ich die entsprechenen Bibliotheken eingebunden habe. kann es sein, dass mein c++ Compiler diese Funktion nicht kennt? Ist ja eine c-Funktion, wenn ich richtig gecshaut habe...
Gibt es keine C++-typische Herangehensweise?
-
#include <iostream> #include <string> string text = "hello world!"; char buffer[20]; int zahl = 13; text += itoa(zahl,buffer,10); cout << text;
-
C++ typisch ist es wohl mit stringstreams:
#include <iostream> #include <string> #include <sstream> using namespace std; template<typename T> string concat(string s, T ding) { ostringstream result; result << s << ding; return result.str(); } template<typename T> string concat(T ding, string s) { ostringstream result; result << ding << s; return result.str(); } int main() { string s = concat("Hallo ", 12); s = concat(4711, " " + s); cout << s << endl; cin.get(); }
-
Die Stream-Lösung sieht schön aus, der String wird dabei aber mindestens einmal mehr kopiert als bei der anderen Lösung (abgesehen davon, dass es über mehr Ecken geht).
-
Das ist richtig. Man sollte wenigstens den string als Referenz übergeben lassen:
template<typename T> string concat(const string &s, T ding) { ostringstream result; result << s << ding; return result.str(); } template<typename T> string concat(T ding, const string &s) { ostringstream result; result << ding << s; return result.str(); }
Alternativ kann man sich auch eine toString Funktion basteln:
#include <iostream> #include <string> #include <sstream> using namespace std; template<typename T> string toString(T x) { ostringstream result; result << x; return result.str(); } int main() { string s = "Hallo " + toString(12); cout << s << endl; cin.get(); }
-
boost::lexical_cast ist auch sehr schön.
itoa() hat in einem sauberen C++ Programm nichts zu suchen.
-
Artchi schrieb:
itoa() hat in einem sauberen C++ Programm nichts zu suchen.
Afaik ist es noch nicht mal im Standard ( weder C noch C++ )
-
Bin immer noch am basteln...
Zum Einen, warum verwendet Ihr template? Was hat es damit auf sich?
Und was ist der Unterschied zwischen stringstream und ostringstream.
Ich habe es zwischenzeitlich nämlich wie folgt probiert:
string str_zaehler; int zaehler; stringstream string_stringstream << zaehler; string_stringstream >> str_zaehler;
Allerdings steht als Ergebnis in string_string_stream dann 0, egal was der zaehler für einen Wert besitzt...
Wenn ich string_stringstream als ostringstream definere, erhalte ich die Fehlermeldung:
no match for 'operator>>' in 'string_stringstream >> str_zaehler
Was mache ich falsch?
-
hilfloser_anfaenger schrieb:
Bin immer noch am basteln...
Zum Einen, warum verwendet Ihr template? Was hat es damit auf sich?
Damit kann man diese Funktion für beliebige Datentypen anwenden (ok, fast - damit das klappt, benötigt der Typ einen geeigneten op<<).
Und was ist der Unterschied zwischen stringstream und ostringstream.
stringstream ist für Ein- und Ausgabe geeignet, ostringstream nur für Ausgabe.
Ich habe es zwischenzeitlich nämlich wie folgt probiert:
string str_zaehler; int zaehler; stringstream string_stringstream << zaehler; string_stringstream >> str_zaehler;
Allerdings steht als Ergebnis in string_string_stream dann 0, egal was der zaehler für einen Wert besitzt...
Mich wundert, daß das überhaupt compiliert. Du vermischst da die Konstruktion des Streams und seine Anwendung. Richtig sollte es so aussehen:
string str_zahl; int zahl=4711; stringstream converter; converter<<zahl; converter>>str_zahl;
-
Sorry, es schaut natürlich so aus:
int zaehler; string str_zaehler; stringstream string_stringstream; string_stringstream << zaehler; string_stringstream >> str_zaehler;
Trotzdem kommt eine 0 im string_stringstream an, obwohl der zaehler einen anderen Wert anzeigt.
-
komisch. bei mir funktioniert es so :D:
#include <iostream> #include <string> #include <sstream> using namespace std; int main() { int spaeter_stringstream_dann_string_zaehler = 7; string erst_integer_dann_string_zaehler; stringstream integer_string_stringstream; integer_string_stringstream << spaeter_stringstream_dann_string_zaehler; integer_string_stringstream >> erst_integer_dann_string_zaehler; cout << erst_integer_dann_string_zaehler << endl; cin.get(); }
-
naja, wenn man diese codemonster hier sieht, ist man doch froh, dass man nur 'C' verwendet und solche schönen funktionen wie atoi() und sprintf() hat
-
Misteriös, dann mache ich sicher noch irgendwo anders einen Fehler...
Ich schaue noch mal genau drüber, aber danke für die Hilfe.
-
Gebs zu atoi() ist kein C++, nichts desto trotz find ich die Lösung mit Streams nicht wirklich berauschend. Fände an dieser Stelle eine Memberfunktion wie sie z.B. CString hat viel sinnvoller.
-
net schrieb:
naja, wenn man diese codemonster hier sieht, ist man doch froh, dass man nur 'C' verwendet und solche schönen funktionen wie atoi() und sprintf() hat
Was spricht eigentlich dagegen, sowas in C++ zu verwenden? (außer dem Aufwand, sich ein entsprechend großes char-Array zu verwalten)
@schorch: Ja, ich weiß, in C++ können Variablenbezeichner beliebig lang werden. Aber man kann's auch übertreiben
-
Hallo,
ich bin immer noch am verzweifeln...
Habe jetzzt mal folgendes ausprobiert:
int zaehler; string str_zaehler; stringstream string_stringstream; string_stringstream << zaehler +1; string_stringstream >> str_zaehler;
Was in zaehler steht, scheint überhaupt nicht zu interessieren.
Resultat ist, dass bei string_stringstream 0 herauskommt und bei str_zaehler 1.Ich finde das sehr misteriös, denn wie kommt die 1 zu str_zaehler, wenn 0 in string_stringstream steht?????
Ich sehe ja ein, dass ich irgendwo einen logischen Fehler machen muß, aber wo???
-
Schau doch hier mal nach ich hatte da auch erst letzens so meine Probleme:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-128289.html
-
An alle die sich fragen, warum kein atoi()? Bitte sagt mir was ihr bei sowas macht:
int i = atoi("Hallo"); // Kann auch eine Variable übergeben werden... egal.
Wie kann ich jetzt zur Laufzeit abfragen, ob atoi auch erfolgreich war? Als Ergebnis für das obige Bsp. bekomme ich wohl 0 zurück? Jedenfalls einen Wert. Wie kann ich das Ergebnis von diesem hier unterscheiden:
int i = atoi("0"); // Kann auch eine Variable übergeben werden... egal.
Hem? 0 kommt natürlich als Ergebnis zurück. Wie kann ich unterscheiden, ob 0 deshalb raus kommt, weil es richtig oder falsch war??? (die Konvertierung meine ich)
Leicht crazy das ganze!
Ich könnte natürlich vorher den String auf korrektheit, also auf Alphas checken! Gut, aber dann sind das auch zwei und mehr Codezeilen. Also nicht wirklich weniger als bei einem std::stringstream!
:p :p :p