(noob) schleife funktioniert nicht
-
Ich hab mittlerweile eine Lösung:
#include <iostream> using namespace std; int main () { int CountdownZahl; int beende; cout << "Hallo!!" << endl; cout << "Geben sie eine beliebige Zahl ein!" << endl; cin >> CountdownZahl; for (int i=CountdownZahl; i>=0; i--) { cout << "Countdown: " << i << endl; } cout << "Zum Beenden beliebige Taste+Enter dr" << "\x81" << "cken!" << endl; cin >> beende; return 0; }Ich habe noch eine Frage:
Wie kann ich abfragen, ob eine Zahl eingegeben wurde?
mit:if (CountdownZahl != 1 && CountdownZahl != 2 && CountdownZahl != 3 && CountdownZahl != 4 && CountdownZahl != 5 && CountdownZahl != 6 && CountdownZahl != 7 && CountdownZahl != 8 && CountdownZahl != 9) { cout << "Es wurde keine Zahl eingegeben!" << endl; system("PAUSE"); }funktionierts erstens nicht, und außerdem is mir das zu umständlich

könnte man das mit einer while-schleife lösen?
-
Achso ... hmm nö was anderes ^^
std::cout << "Hallo!!" << std::endl; std::cout << "Geben sie eine beliebige Zahl ein!" << std::endl; unsigned short CountdownZahl = 0; std::cin >> CountdownZahl; for (; CountdownZahl > 0; --CountdownZahl) std::cout << "Countdown: " << CountdownZahl << std::endl;brauchst de ja keine extra variable für

-
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.