char-Eingabe verhindern!! Wie??



  • 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);
    }
    


  • @prolog

    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;
    }
    

Anmelden zum Antworten