#include<strstream>



  • 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 wie std::strstream veraltet. Nimm statt dessen <sstream> und std::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 😉


  • Mod

    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



  • Sone schrieb:

    camper schrieb:

    die arithmetischen Extraktoren

    *alle

    Kaboooommm!



  • Michael E. schrieb:

    Sone schrieb:

    camper schrieb:

    die arithmetischen Extraktoren

    *alle

    Kaboooommm!

    😕 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!


  • Mod

    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 Ausdruck istream >> 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


  • Mod

    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 ausgeben
    

    Hier 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 ausgeben
    

    Hier 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! 😉


Anmelden zum Antworten