Anfänger (while-Schleife)



  • mit 5.0 klappt es... aber wieso? und wie krieg ich es hin, dass es auch mit 5 funktioniert? 😕



  • mach doch mal den Zeilenumbruch bei scanf raus, dann gehts direkt



  • ohje, wenn nur alles so einfach wäre!
    Jetzt hab ich nur noch das Problem, dass das programm verrückt spielt, wenn keine zahl sondern ein buchstabe eingegeben wird.



  • naja das kannste so abfangen

    if(!cin)
    {
       //mach irgendwas, eine fehlermeldung z.B.
      cin.clear();cin.ignore()
    }
    


  • ist i eine Fließkommerzahl? (double, float) Dann kann das nicht gehen ^^ Ehm mach mal eine Ganzzahl (Integer) daraus!

    #include <iostream>
    
    int main()
    {
        int number(-1);
        while (i < 0) 
        {
           std::cout << "Geben Sie eine Zahl ein: " << std::flush;
           std::cin >> i;
        }
    }
    

    ... jetzt kannst du einfach "5" eingeben und es geht 😛
    So. Dann zu deinem Problem. Du musst halt eine falsch-Eingabe abfangen (bei C++ viel einfacher als bei C 😛 .. darum auch lieber Streams nutzen (std::cin)).

    std::istream& clstream(std::istream& in)
    {
        in.sync();
        in.clear(); // failbit und badbit löschen
        in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
        // Maximale Datenmenge die in einen stream gehen (std::numeric_limits<std::streamsize>::max()
        // oder bis zum nächsten '\n' alles aus dem 
        // Eingabe-Buffer schmeißen. Hängt damit zusammen, 
        // das es sich um eine gebufferte Eingabe handelt.
        return in;
    }
    

    ... so =>

    std::cin >> i;
    

    ließt ja deine Zahl ein. Jetzt wird das failbit des Streams gesetzt, wenn du eine für den Datentyp inkompatible Eingabe machst. std::istream hat den operator! überladen, und kannst so konfortabel überprüfen, ob ein Fehler aufgetreten ist:

    do
    {
        clstream(std::cin) >> i;
    } while (!std::cin);
    

    So, das kann man sich dann noch in ein Template packen:

    template<typename T>
    void read_type(std::string const& prompt, T& dest)
    {
        do { std::cout << prompt << std::flush; } while (!(clstream(std::cin) >> dest));
    }
    

    😛



  • (D)Evil, du hast schon gelesen, dass im Titel "Anfänger" steht, oder? Du erklärst zwar gut, aber ich bezweifle, ob ihm Templates nun viel weiter helfen 🙂



  • Aber ich finde man sollte die read_type-Funktion jetzt mal ins F.A.Q. packen (und clstream dann nat. auch :P), damit Anfänger nicht jedesmal danach fragen und vor allem dann nicht eine inkorrekte Version aus dem F.A.Q. nehemen (siehe ein paar Topics weiter oben).



  • Was soll denn "clstream" heißen? Typo?



  • ? clearstream abkürzung und steht auf der verlinkten Seite ... erst Stream aufräumen und dann ein Zeichen einlesen ... ? wo ist jetzt dein Problem?



  • clear_stream


Anmelden zum Antworten