char-Eingabe verhindern!! Wie??
-
Ich habe ein Programm geschrieben und es ergibt sich folgendes Problem:
Ich muss eine int-Eingabe tätigen(mit dem Wert muss ich nachher rechnen können)! Wenn diese Eingabe kleiner "0" ist, wird eine Fehlermeldung ausgegeben und der Vorgang dann mit einer Schleife wiederholt!
Wenn ich aber anstatt eines int's einen char eingebe, fängt das Programm an zu spinnen! Kann ich also irgendwie eine char-Eingabe verhindern?? Dass dann z.B. auch eine Fehlermeldung ausgegeben wird!??
Vielleicht kann mir jemand helfen....MfG
kent2
-
Hallo,
Warum dein Program dann spinnt ist mir nicht ganz klar. Das es was unerwartet ausgibt kann ich mir schon vorstellen.
int z; cin>>z; //rechnen
Wenn man jetzt eben b eingibt wird eben der numerische Wert von b verwendet.
-
Du könntest das failbit von cin prüfen.
-
Wie prüfe ich denn das failbit von cin??
@ prolog: Wenn ich einen char bei cin eingebe, dann wird die Fehlermeldung und die Eingabemaske ganz schnell im Wechsel angezeigt und hört nicht mehr auf! PS: Mit dem numerischen Wert darf auch nicht gerechnet werden! Ich muss eine char Eingabe also irgendwie verhindern können....
kent2
-
Kannst du mal bitte ein Stück Quelltext reinstellen wie du einliest? Danke
Ansonsten muss ich prolog recht geben
-
Die Eingabe läuft ungefähr so ab:
#include <iostream> #include <windows.h> using namespace std; void FuncFehler(); int main() { int anzahl; do { system("cls"); cout<<"Anzahl: "; cin>>anzahl; if(anzahl<1)FuncFehler(); } while(anzahl<1); return 0; } void FuncFehler() { char zurueck; system("cls"); cout<<"Fehler!\nzurueck: "; cin>>zurueck; }
-
Wo ist jetzt das Problem, der Code funktioniert doch
void FuncFehler() { char zurueck; system("cls"); cout<<"Fehler!\nzurueck: "; cin>>zurueck; }
Nur wofür brauchst du die Variable zurück?
mfg
-
Der Code funktioniert, wenn ich einen int-Wert eingebe! Bei einem char aber nicht!! Ich hab extra ein neues Projekt aufgemacht und genau den geposteten Quelltext getestet!!
(Wenn ich die Variable "zurueck" nicht hätte, würde durch system("cls") die Fehlermeldung nicht angezeigt werden!)
kent2
-
[...]Bei einem char aber nicht[...]
Da ein char auch eine Zahl sein kann, muss ich mich korrigieren! Bei Eingabe von Buchstaben oder Sonderzeichen, spinnt das Programm, also bei allem was nicht int ist!!
Also hat jemand eine Idee, wie ich das verhindern kann??kent2
-
Wenn du es nicht einmal am Bildschirm sehen willst hast du keine Chance mit dem Standard.
Siehe getch() in der Konsolen-FAQ.
Für float-Werte steht auch bereits etwas in der Konsolen-FAQ, das auf Integers umzubauen sollte kein so großes Problem sein, da es einfacher ist.MfG SideWinder
-
Es wäre kein Problem, wenn es am Bildschirm angezeigt wird! Wenn ich aber "enter" drücke, sollte eine Fehlermeldung erscheinen!! Ändert das was??
Ich schau mir mal die FAQ an...Gruß
kent2
-
Dann wäre wirklich das einzige was mir einfällt es mit getch() zu versuchen. Dazu die <conio.h> einbinden und die Tasten abfragen
-
Hallo,
Es wurde doch schon vorgeschlagen das Failbit zu prüfen
int zahl; cin>>zahl; if(cin.fail()) ErrorFunc();
-
Die Methode mit dem Failbit funktioniert auch nicht!!
MfG
kent2
-
kent2 schrieb:
Die Methode mit dem Failbit funktioniert auch nicht!!
MfG
kent2"Funktioniert nicht" ist zu wenig.
Welche Fehlermeldung bekommst du denn oder erkennst du es erst zur Laufzeit?
Dieses funktioniert nicht?:#include <iostream> int main() { int zahl; std::cin >> zahl; if(std::cin.fail()) std::cout << "Error" << std::endl; else std::cout << zahl << std::endl; }
-
Hmm,
also bei mir funktioniert diese Methode nachweislich.
Auch mittels Exceptions kann man das machen.
try{ int zahl; cin.exceptions(ios_base::failbit); cin>>zahl; }catch(...){ cout<<"Fehler keine Zahl"<<endl; exit(0); }
-
Hast du mein Programm genau übernommen?? Wenn ja, dann dürfte es nicht funktionieren!! Das Problem liegt an der do-while, wenn die nicht wäre, dann würde es funktionieren!
do { // // } while(anzahl<1);
Aber die Schleife brauche ich nunmal, da sich die Eingabe bei Falscheingabe wiederholen muss!!
kent2
-
Nope habs nicht genau übernommen, jetzt weiss ich auch welches komische Verhalten du meinst. Normalerweise sollte sich das mit cin.clear() beheben lassen. Ich habs probiert und es hat NICHT geklappt. Im moment bin ich etwas ratlos.
Man kann natürlich den umständlichen Weg gehen und in einen String einlesen, den umwandeln bzw. testen ob es sich um eine Zahl handelt und dann entsprechend reagieren. Aber wie gesagt, das ist umständlicher.
-
hier ein Vorschlag für den umständlichen Weg, welcher aber funktioniert:
#include<iostream> using namespace std; int main(){ char cControl = ' '; int digit; cin.get(cControl); while( !isdigit(cControl) ){ cout<<"validity error!"<<endl; cin.get(cControl); } cin.putback(cControl); cin>>digit; return 0; }