Eingabeprüfung <int>
-
wie bekomme ich eine Eingabeprüfung für eine natürliche Zahl ungleich Null so einfach wie möglich hin, ohne daß ich casts,stringstreams, isdigit() o.ä. verwenden muß? Wie fange ich die Eingabe von alphabetischen Zeichen bzw. allen nicht-Ziffern ab? Ich dachte immer, daß ich das schon mit fail() mache, aber das fliegt mir um die Ohren.
Bsp:int n; do{ cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; cin>>n; }while( cin.fail() || n<=0 );
klappt für Eingabe von nicht-Ziffer nicht, auch wenn ich Fehlerflags zurücksetze.
post scriptum: was kann man denn statt "nicht-Ziffer" sagen?
-
freshman schrieb:
post scriptum: was kann man denn statt "nicht-Ziffer" sagen?
Buchstabe? Nichtnumerisches Zeichen?
-
...ich weiß nicht was soll es bedeuten...
ich weiß zwar nicht genau warum, aber im Gegensatz zum Code aus dem ersten posting funktioniert das hier:int n; string line; do{ cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; cin>>n; if( cin.fail() ){ cin.clear(); cin>>line; n=0; } }while( n<=0 );
Bitte um Verbesserungen und Anregungen, bitte.
und das hier funktioniert natürlich auch:while( n<=0 || cin.fail() ){ cin.clear(); cin>>line;//unschön, da auch bei erstem Durchlauf string eingelesen werden muß cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; cin>>n; }
wenn cin failed, dann steht die Eingabe noch im Puffer und muß erst ausgelesen werden, aber warum funktioniert:
int n; do{ cin.clear(); cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; cin>>n; }while( cin.fail() || n<=0 );
nicht? Gibt es nicht so was ähnliches wie flush() bei ostream?
-
ignoriere solange, bist enter folgt..
#include<limits> //for nuumeric_limits float fl; while(!(std::cin >> fl)) { std::cin.clear(); std::cin.ignore(std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); }
hier noch ein paar ideen:
http://www.augustcouncil.com/~tgibson/tutorial/iotips.html#directly
-
thanx', but...
bin ich falsch oder ist bei
std::cin.ignore(std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
ein ignore() zu viel und eine schließende Klammer zu wenig;-)do{ cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; cin>>n; if( cin.fail() ){//alternativ: if( !cin ) cin.clear(); //cin>>line;//Eingabepuffer leeren //ob nun so.... cin.ignore(numeric_limits<int>::max(),'\n');//....oder so ist eigentlich gleich häßlich n=0; }
aber mein favourite:
cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; while(!(std::cin >> n) || n<=0 ){ std::cin.clear(); std::cin.ignore(std::numeric_limits<int>::max(),'\n'); cout<<endl<<"Bitte geben Sie eine positive ganze Zahl (ungleich Null) ein: "<<endl; //nicht so schön, daß die Aufforderung zwei mal auftaucht;-(( }
okay so??
-
hab ich aus der seite eben kopiert...
nimms als anregung
-
@elise: was sagst du denn zu meinem favourite? Kritik erwünscht.