int an string anhaengen
-
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
-
Hmm, du könntest ja auch strtol verwenden:
char* epos,*text=/*irgendein Stringwert*/; int i=strtol(text,&epos,10); if(epos==text) cout<<"Konvertierungsfehler\n"; else if(*epos!='\0') cout<<"unvollständige Konvertierung, Reststring:"<<epos<<endl;
"Hallo" würde hier zu einem Konvertierungsfehler führen, "0" problemlos erkannt (und "47elf" würde i auf 47 setzen und den Reststring "elf" ausspucken).
-
vielleicht irgentwie so:
#include <cstdlib> #include <iostream> using namespace std; bool meinatoi(char *was1, int *was2) { if(was1[0] < '0' || was1[0] > '9') { return false; } *was2 = atoi(was1); return true; } int main(int argc, char *argv[]) { int bla; if(!meinatoi("$",&bla)) { cout << "fehler" << endl; } else { cout << bla << endl; } if(!meinatoi("7",&bla)) { cout << "fehler" << endl; } else { cout << bla << endl; } if(!meinatoi("Hallo",&bla)) { cout << "fehler" << endl; } else { cout << bla << endl; } system("PAUSE"); return EXIT_SUCCESS; }
-
Ja und? Sind eure selbstgemachten Beispiele kürzer als stringstream oder wie?
Also, itoa hat nichts in einem sauberen C++ Projekt zu suchen. Es hat schon seinen Grund, warum es eine C++ Standardlib gibt.
-
Artchi schrieb:
Ja und? Sind eure selbstgemachten Beispiele kürzer als stringstream oder wie?
Also, itoa hat nichts in einem sauberen C++ Projekt zu suchen. Es hat schon seinen Grund, warum es eine C++ Standardlib gibt.
Hää? Was willst du? Du fragst:
Wie kann ich unterscheiden, ob 0 deshalb raus kommt, weil es richtig oder falsch war???
Ich antworte mit der funktion die das macht. Wo ist das Problem? Von itoa war nie die Rede in meinem Beitrag??!
mfg.
-
Sorry, meinte atoi... hab mich vertippt. Ändert aber an meiner Frage nichts: warum sollte ich atoi einsetzen anstatt stringstreams???
-
Artchi schrieb:
Sorry, meinte atoi... hab mich vertippt. Ändert aber an meiner Frage nichts: warum sollte ich atoi einsetzen anstatt stringstreams???
kA. Wollte dir nur zeigen dass das zeimlich einfach geht. naja was soll's, ist ja auch egal.
mfg.
-
Ich glaub wenn die Standardlib bei Strings nicht so gruselig wäre würde auch kein Mensch mehr atoi benutzen. Bevor ich bei einem String-Stream wieder rausgefunden habe was clear und flush macht und das beides nicht das ist was ich will hab ich zehnmal atoi oder good old sprintf verwendet.
-
asdrubael schrieb:
Ich glaub wenn die Standardlib bei Strings nicht so gruselig wäre würde auch kein Mensch mehr atoi benutzen. Bevor ich bei einem String-Stream wieder rausgefunden habe was clear und flush macht und das beides nicht das ist was ich will hab ich zehnmal atoi oder good old sprintf verwendet.
vor allem wenn dann solche bekloppten sachen wie die winapi in c geschrieben sind. dann muss die ganze scheiße wieder umkonvertiert werden. Da bleib ich doch gleich bei denen.
Aber wenn man sich richtig auskennt (was ich mich nicht tue), sind natürlich string und sstreams besser.
mfg.
-
joomoo schrieb:
Artchi schrieb:
Sorry, meinte atoi... hab mich vertippt. Ändert aber an meiner Frage nichts: warum sollte ich atoi einsetzen anstatt stringstreams???
kA. Wollte dir nur zeigen dass das zeimlich einfach geht. naja was soll's, ist ja auch egal.
mfg.
Mir ist durchaus bewusst, das ich mit weiteren C-Funktionen und if's zu dem Ziel hinkommen. Meine Frage auf Seite zwei war ja auch provokativ gemeint. Natürlich habt ihr mir die Bestätigung geliefert, das der C-Kram nicht kürzer ist als ein einfacher stringstream. Es ging darum, das jemand meinte, er findet stringstream vom Codeanteil her zu groß und atoi wäre ja kürzer. Stimmt aber nicht, weil in einer sicheren Programmumgebung viele Ausnahmefälle geprüft werden müssen, um Bugs zu verhindern. Das geht nur, wenn man mehr als nur atoi benutzt.
Ergo kann man auch gleich stringstreams benutzen da dieses schon die Prüfungen durchführt, ohne das ich ein if und irgendwelche C-Stringfunktionen. Das war alles was ich sagen wollte.
Wer es noch einfacher haben will (was ich auch in meinem ersten Post sagte, aber keiner reagiert hat) benutzt boost::lexical_cast.