(noob) schleife funktioniert nicht



  • wenn keine Zahl eingegeben wurde steht in Coutdownzahl schlichtweg 0 bzw der wert den du vorher zugewiesen hast 😉



  • darthdespotism schrieb:

    wenn keine Zahl eingegeben wurde steht in Coutdownzahl schlichtweg 0 bzw der wert den du vorher zugewiesen hast 😉

    Ja, doch dann beendet sich das Programm ja...
    Ich möchte den Benutzer ja darauf hinweisen, und dann beispielsweise das Programm wiederholen, oder so.

    mfg no-noname

    P.S.:
    Sehr coole Community!
    Schnelle und gute Antworten... *freu*



  • Hmm wenn du das haben willst musst du mit sowas hier arbeiten:

    #include <iostream>
    #include <string>
    #include <sstream>
    
    int main()
    {
    	std::cout << "-\tCountdown V1\t-" << std::endl;
    	std::cout << "Geben Sie bitte die Länge des Countdowns ein!" << std::endl;
        unsigned short count_down_length = 0;
    
    	std::istringstream ss;
    	std::string string_input;
    
    	do {
    		std::getline(std::cin, string_input);
    		ss.clear();
    		ss.str(string_input);
    		ss >> count_down_length;
    	} while (!ss);
    
    	for (;  count_down_length != 0; --count_down_length)
    		std::cout << count_down_length << std::endl;
    
    	std::cout << "Press Enter to close!" << std::endl;
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();
    
    	return 0;
    }
    

    ...



  • 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