Eingabe von einem Buchstaben in einn Integer



  • kann mir das mal jemand erklären:

    #include <iostream>

    using namespace std;

    int main()
    {
    unsigned short zahl=0;
    cout << "\ngeben Sie bitte eine Zahl ein: ";
    while(!(cin >> zahl))
    {
    cout << "\nFalsche eingabe, bitte widerholen: ";
    }
    cout << "\nDie eingegebene Zahl lautet: " << zahl << endl;
    return 0;
    }

    wenn mann statt einer geforderten Zahl einen Buchstaben eingibt, wird die Meldung "\nFalsche eingabe, bitte widerholen: " unendlich lange widerholt!
    aber bei der nächsten Schleifendurchlauf der while Schleife hätte doch der Befehl "cin >> zahl" erneut auf eine UserEingabe warten müssen oder 😕
    Wiso tut er das nicht und wie könnte ich mit dem gleichen Schema das Problem anders lösen? 😞

    Thx



  • Ich würde einen String benutzen und jede Stelle überprüfen, ob es eine Ziffer ist.

    Dafür gibt es die Funktion isdigit() aus <cctype>.

    Weil ich gerade Langeweile hab, hab ich dein Problem gelöst.

    Neben Zahlen darf nun auch genau ein Komma eingegeben werden, damit die Eingabe als Zahl erkannt wird.

    #include <iostream>
    #include <cctype>
    #include <string>
    using namespace std;
    
    int main()
    {
    	cout << "Bitte Zahl eingeben: ";
    	string zahl;
    	cin >> zahl;
    	int b=0;
    	int komma=0;
    	for(int i=0; i<zahl.length(); ++i)
    	{
    		if(isdigit(zahl[i]) || zahl[i]==',')
    			b+=1;
    		if(zahl[i]==',')
    			komma+=1;
    	}
    	while(b!=zahl.length() || komma>1)
    	{
    		cin.sync();    // loescht alle noch nicht eingelesenen Zeichen
    		b=komma=0;
    		cout << "Bitte versuchen Sie es nochmal: ";
    		cin >> zahl;
    		for(int i=0; i<zahl.length(); ++i)
    		{
    			if(isdigit(zahl[i]) || zahl[i]==',')
    				b+=1;
    			if(zahl[i]==',')
    				komma+=1;
    		}
    	}
    	cout << "\nDie eingegebene Zahl lautet: " << zahl << endl; 
    
    	return 0;
    }
    

    Ich schlage diesen Thread für die FAQ vor.



  • Das hier ist die Lösung die ich mir so zusammengesucht habe.

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	unsigned short zahl=0;
    
    	cout << "\ngeben Sie bitte eine Zahl ein: ";
    	while(!(cin>>zahl))
    	{
    		cin.clear(0);
    		cin.ignore(100,'\n');
    		cout << "\nFalsche eingabe, bitte widerholen: ";
    	}
    	cout << "\nDie eingegebene Zahl lautet: " << zahl << endl;
    	return 0;
    }
    

    EDIT: nochmal etwas geaendert



  • @Entyl_Sa: Deine Version ist für einen Anfänger bestimmt einfacher zu verstehen, aber meine funktioniert mit unendlich großen und mit Kommazahlen (ich meine jetzt wirklich mit "," geschrieben).



  • Vielen Dank euch beiden 🙂

    Wollte mit dieser Funktion nur mit Zahlen arbeiten aber diese Maßnahme diente nur dem Ausschließen von falschen UserFehleingaben wie Buchstaben womit für mich @Entyl_Sa sein Vorschlag am sinnvollsten ist.
    Genau so wollte ich es haben 🙂

    Ich würde nun aber gerne auch kapieren wollen was diese zwei Befehlssetze cin.clear(0) & cin.ignore(100,'\n')
    denn nun genau tun weil ich danach in meinen büchern suchte aber nicht fündig wurde



  • Ich habe mir einfach mal angeschaut was fuer Methoden man so zu cin aufrufen kann, weil ja da offensichtlich das Problem liegt. Bin dann auf clear gekommen und habe mal danach gegoogelt und bin dabei auf diese Loesung gekommen. Daraus folgt natuerlich das ich das so genau auch nicht erklaeren kann. Aber cin.clear() setzt wohl irgendwie den Zustand zurueck, ja was heist das jetzt genau?
    cin.ignore ist schon einfacher zu verstehen das leert einfach den Buffer von cin um die angegebene Zeicherzahl, oder bis zu dem angegebenen Zeichen '\0'
    Genauer kann ich es dir leider auch nicht erklaeren.



  • Guten Abend.
    cin.clear() löscht gestzte Flags. (z.B. eof Failbits...)

    MfG Max



  • hatte dasselbe problem, versuchs mal hiermit:

    http://mandrill.fuxx0r.net/c++/

    und dann unter faq + minitutorials die cin eingaben...


Anmelden zum Antworten