#include<strstream>
-
Ich konvertiere von string zu int ohne Probleme. Nehmen wir an als string wird fälschlicherweise ein "Hallo" o.ä. übergeben. Dann kommt erstmal Blödsinn raus (meistens 16, aber gut). Aber schlimmer noch. Danach geht auch nichts mehr: Seht her:
#include <iostream> #include <strstream> #include <string> using namespace std; int main() { string s("Hallo"); strstream convert; int sinint; convert << s; convert >> sinint; cout << sinint << endl; convert.clear(); string t("2"); int zwei; convert << t; convert >> zwei; cout << zwei; }Ausgabe:
16 1700027504D.h. wenn ich einmal etwas Falsches (also ein string-Wort oder so) übergeben habe ist alles dahin. Auch convert.clear(); hilft irgendwie nix.
Mein Anliegen:
Ich will, dass wenn ein Wort wie "Hallo" eingelesen wird ein int mit Wert -1 ausgegeben wird
Ich will dass danach richtig weitergearbeitet wird wenn im weiteren Verlauf ein string s("2") übergeben werden sollteThanks schonmal!

-
was ist denn strstream?
ich kenne nur std::stringstream, und der header dazu lautet <sstream> (jedenfalls bei mir unter msvc2010)
falls dies nun dasselbe sein sollte, das einfache clear reicht nicht. die streams laufen etwa so ab: die lesen die sachen ein, char für char, und prüfen ob was schief ging, wenn ja, stoppen die und setzen ein fehlerbit auf true. clear setzt dieses bit nur zurück. wenn du aber jetzt weiter einlesen willst, macht der and er stelle weiter wo du aufgehört hast (wo dein fehler kam), und jetzt, kann es passieren dass alles glatt läuft, wird es in 999.99999% der Fälle aber nicht. du musst auch den stream wieder leer machen, wenigstens (bei zahlen) bis zum nächsten \n
guckst du hier:
std::stringstream ss; // ... ss.clear(); ss.ignore(ss.rdbuf()->in_avail());
-
strstream ist deprecated. Nicht verwenden.
-
Skym0sh0 schrieb:
was ist denn strstream?
strstream findest du ganz hinten im Standard unter "deprecated"

-
super, dann mach ich ja alles richtig
-
Skym0sh0 schrieb:
und jetzt, kann es passieren dass alles glatt läuft, wird es in 999.99999% der Fälle aber nicht.
Es ist also zieeeeemlich sicher, dass es nicht glatt läuft. Wirklich, wirklich sicher. Mehr als sicher. :p
-
<strstream>Ist wiestd::strstreamveraltet. Nimm statt dessen<sstream>undstd::stringstream- Du musst eine Fehlerbehandlung einbauen:
std::string s("Hallo"); std::istringstream convert(s);//Richtige Klasse int sinint(0);//Hier initialisierst du die Variable erstmal ;) if(convert >> sinint) //Wenn erfolgreich, also die Konvertierung des Streams nach void* gibt keinen Null-Pointer zurueck und indiziert somit, dass nicht fail/bad-bit gesetzt wurde std::cout << sinint; //Ausgeben else std::cout << (sinint = -1); //Sonst sinint auf -1 setzen und das ausgeben std::cout << '\n'; //Du willst nicht flushen... :rolling_eyes: nimm eine Escapesequenz convert.clear(); std::string t("2"); convert.str(t); // Achtung! Hier lasse ich die Fehlerbehandlung weg, weil das nur ein Beispiel ist. Im echten Programm immer nutzen! int zwei(0);//Edit: Brav initialisieren convert >> zwei; std::cout << zwei; //Gibt bei mir 2 aus... :arrow_right: :rolling_eyes:Edit: VIEL ZU SPAET???

-
strstream ist die veraltete, prä-standard-version von stringstream, basiert auf char[] statt auf std::string. einfach sein lassen

-
Welcher Compiler wird da verwendet?
Da auch strstream auf den normalen stream-Klassen beasiert, sollten die arithmetischen Extraktoren genauso arbeiten, im Fehlerfall also eine 0 zurückliefern.
-
camper schrieb:
die arithmetischen Extraktoren
*alle
-
-
Michael E. schrieb:
Sone schrieb:
camper schrieb:
die arithmetischen Extraktoren
*alle
Weswegen sollten die anderen (Edit: Extraktoren) sich anders verhalten?Edit: Lol, der Mod der das editiert hat hat einige Posts doppelt gelassen. SeppJ?
-
Oh nein, schick mir jetzt bloß keinen Elektroschrott!

-
_matze schrieb:
Oh nein, schick mir jetzt bloß keinen Elektroschrott!

Zu spaet.
Adresse? Du kriegst noch ein intaktes 1GB DDR3-SDRAM Modul gratis!
-
Erstmal Danke an Alle! Ich benutze jetzt natürlich auch sstream ...
@Sone: Speziellen Dank an dich, ist natürlich perfekt dieser Code und funzt super.
Bis dann!
-
Sone schrieb:
Weswegen sollten die anderen (Edit: Extraktoren) sich anders verhalten?Weil der Standard das so festlegt. Die Zeichen- und Stringextraktoren verändern ihr ARrgument nicht im Fehlerfall. Die arithmetischen Extraktoren benutzen alle num_get, und das liefert eben 0 im Fehlerfall.
-
camper schrieb:
Sone schrieb:
Weswegen sollten die anderen (Edit: Extraktoren) sich anders verhalten?Weil der Standard das so festlegt. Die Zeichen- und Stringextraktoren verändern ihr ARrgument nicht im Fehlerfall. Die arithmetischen Extraktoren benutzen alle num_get, und das liefert eben 0 im Fehlerfall.
???
Ich dachte du beziehst dich auf den Konvertierungsoperator! Also dass der Ausdruckistream >> var"Null zurueck gibt" (eigentlich liefert er ja eine Referenz, aber fortgedacht...)Edit: Ja, du meinst wohl die Variable. Klar, dass das nur bei den arithmetischen Extraktoren so laeuft, bei bspw. Zeigern waere das wohl auch vielleicht unsinnig
-
Edit: das gilt so nur für C++11.
In C++03 wird im Fehlerfall in num_get nichts zugewiesen.
-
Okay, ich habe mich zu weit aus dem Fenster gewagt.
convert >> sinint; if(convert >> sinint) //Wenn erfolgreich, also die Konvertierung des Streams nach void* gibt keinen Null-Pointer zurueck und indiziert somit, dass nicht fail/bad-bit gesetzt wurde std::cout << sinint; //Ausgeben else std::cout << (sinint = -1); //Sonst sinint auf -1 setzen und das ausgebenHier bekomme ich immer False, also eine 0 zurück. Dementsprechend wird immer auf -1 gesetzt. Wie macht man das jetzt richtig?
-
Mathias1986 schrieb:
Okay, ich habe mich zu weit aus dem Fenster gewagt.
convert >> sinint; if(convert >> sinint) //Wenn erfolgreich, also die Konvertierung des Streams nach void* gibt keinen Null-Pointer zurueck und indiziert somit, dass nicht fail/bad-bit gesetzt wurde std::cout << sinint; //Ausgeben else std::cout << (sinint = -1); //Sonst sinint auf -1 setzen und das ausgebenHier bekomme ich immer False, also eine 0 zurück. Dementsprechend wird immer auf -1 gesetzt. Wie macht man das jetzt richtig?
Ich hab ausversehen das convert >> sinint in Zeile 1 oben nicht geloescht

Losch es und es duerfte funktionieren.Also der Code muss so aussehen (auch oben editiert):
std::istringstream convert(s); int sinint(0); if(convert >> sinint) //Wenn erfolgreich, also die Konvertierung des Streams nach void* gibt keinen Null-Pointer zurueck und indiziert somit, dass nicht fail/bad-bit gesetzt wurde std::cout << sinint; //Ausgeben else std::cout << (sinint = -1); //Sonst sinint auf -1 setzen und das ausgeben
-
Ganz begreifen tu ichs nicht aber jo, es funktioniert!
Mörci!
