(noob) schleife funktioniert nicht



  • Warum so umständlich?

    int start;
    while(!(cin>>start))//wenn da keine Zahl angegeben wurde, landet cin im fail()-Status
    {
      cin.clear();
      cin.ignore(4711);
      cout<<"Bitte eine ZAHL eingeben!!"<<endl;
    }
    


  • @CStoll: aus interesse: warum die 4711?



  • Shinja schrieb:

    @CStoll: aus interesse: warum die 4711?

    Weil sie schön aussieht 😃 (ich hätte auch '0815' nehmen können, aber das dürfte der Compiler nicht schlucken)



  • Ok, und warum schreibt man dann in der Regel cin.ignore(cin.rdbuf()->in_avail()); ?

    Ist es einfach so, dass du eine Zahl waehlst, die gross genug ist, um sicher genug freizugeben?



  • Shinja schrieb:

    Ok, und warum schreibt man dann in der Regel cin.ignore(cin.rdbuf()->in_avail()); ?

    Das ist auch eine Möglichkeit, aber mitunter nicht sehr portabel (hier im Forum sind schon Fälle aufgetaucht, wo in_avail() einen "falschen" Wert zurückgegeben hat). Auf der sicheren Seite bist du mit cin.ignore(numeric_limits<streamsize>::max());



  • Vielen Dankm dann tausche ich das mal am besten jetzt immer aus.



  • CStoll schrieb:

    Shinja schrieb:

    Ok, und warum schreibt man dann in der Regel cin.ignore(cin.rdbuf()->in_avail()); ?

    Das ist auch eine Möglichkeit, aber mitunter nicht sehr portabel (hier im Forum sind schon Fälle aufgetaucht, wo in_avail() einen "falschen" Wert zurückgegeben hat). Auf der sicheren Seite bist du mit cin.ignore(numeric_limits<streamsize>::max());

    Ich weiß, das ist jetzt doof 😃 , aber ich hab das [Zitat] nicht verstanden!
    Könnte ich eine Erklärung bekommen?



  • Was hast du denn daran nicht verstanden?



  • cin.ignore( numeric_limits<streamsize>::max( ) );
    

    Wirft soviele Zeichen in cin weg ( cin.ignore( ) ) wie maximal in einem stream existieren können ( numeric_limits< streamsize >::max( ) ). Auf gut Deutsch: mit Sicherheit alle.

    greetz, Swordfish



  • Ergänzend könnte man (imo: sollte man) dem ignore noch einen Delimiter mitgeben, dann kann man schön im voraus tippen oder die Eingabe reinpipen.

    cin.ignore( numeric_limits<streamsize>::max( ), '\n' );
    


  • LordJaxom schrieb:

    Ergänzend könnte man (imo: sollte man) dem ignore noch einen Delimiter mitgeben, dann kann man schön im voraus tippen oder die Eingabe reinpipen.

    cin.ignore( numeric_limits<streamsize>::max( ), '\n' );
    

    Ja, sieht nett aus, bringt aber auch nichts neues - '\n' ist sowieso der Default-Wert für den zweiten Parameter von ignore().

    (interessant wird dieser Parameter erst, wenn du ein anderes Zeichen als "Zeilen"ende verwenden willst)



  • CStoll schrieb:

    '\n' ist sowieso der Default-Wert für den zweiten Parameter von ignore().

    Nach meinen Informationen ist der Default-Delimiter bei basic_istream::ignore eof, oder verwechsel ich da was?

    EDIT: '\n' war bei getline.



  • OK, Punkt für dich (nochmal nachgeguckt hat) - ich hatte irgendwo im Hinterkopf, daß ignore() auch bis zum \n liest.


Anmelden zum Antworten