Integer Werte mit cin einlesen, Buchstaben ignorieren (nicht einlesen)?



  • Hallo Experten!

    Ich schreibe gerade ein Programm welches Preise und Mengen einliest und die Bestellmenge und den Gesamtpreis ausgibt. Dabei möchte ich, dass nur Zahlen eingegeben werden sollen. Auch die Eingabe von 0 soll nicht erlaubt sein. Ich habe es auch schon wie folgt gelöst:

    do {
    
    			cout << "Bitte den Preis pro Fass angeben: ";
    			cin >> preis;
    
    			if (preis <= 0)
    				do {
    
    					cout << "Ungueltige Eingabe, bitte wiederholen!\n";
    					cin.clear();
    					cin.ignore(cin.rdbuf()->in_avail());
    					cin >> preis;
    				} while (preis <= 0);
    		} while (preis <= 0);
    
    		cout << "Fassvolumen in Liter eingeben: \n";
    		cin >> volumen;
    
    		if (volumen <= 0)
    			do {
    
    				cout << "Ungueltige Eingabe, bitte wiederholen!\n";
    				cin.clear();
    				cin.ignore(cin.rdbuf()->in_avail());
    
    				cin >> volumen;
    			} while (volumen <= 0);
    

    Das funktioniert so auch, nur gibt es ein Problem:
    Bei der Eingabe eines Preises von "25R" , wird 25 als Preis eingelesen und der Buchstabe R wird beim Volumen eingelesen. Dies führt natürlich zu einer Fehlermeldung biem Volumen. Ich möchte aber, dass "25R" beim Preis eingelesen wird und eine Fehlermeldung beim Preis ausgeworfen wird. Wie schaffe ich, dass das R von 25R noch beim Preis eingelesen wird? Ich hoffe es ist halbwegs verständlich, was ich meine! 🙂 LG

    Anbei noch mein gesamtes Programm falls benötigt:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
    
    	char neu = 'n';
    	int volumen, menge, stueck, preis;
    
    	do { 
    		do {
    
    			cout << "Bitte den Preis pro Fass angeben: ";
    			cin >> preis;
    
    			if (preis <= 0)
    				do {
    
    					cout << "Ungueltige Eingabe, bitte wiederholen!\n";
    					cin.clear();
    					cin.ignore(cin.rdbuf()->in_avail());
    					cin >> preis;
    				} while (preis <= 0);
    		} while (preis <= 0);
    
    		cout << "Fassvolumen in Liter eingeben: \n";
    		cin >> volumen;
    
    		if (volumen <= 0)
    			do {
    
    				cout << "Ungueltige Eingabe, bitte wiederholen!\n";
    				cin.clear();
    				cin.ignore(cin.rdbuf()->in_avail());
    
    				cin >> volumen;
    			} while (volumen <= 0);
    
    			cout << "Bitte bestellte Menge in Liter eingeben: \n";
    			cin >> menge;
    			if (menge <= 0 || menge < volumen)
    				do {
    					cout << "Ungueltige Eingabe, bitte wiederholen! (Mindestbestellmenge?) \n";
    					cin.clear();
    					cin.ignore(cin.rdbuf()->in_avail());
    
    					cin >> menge;
    
    					if (menge < volumen)
    						do {
    							cout << "Ungueltige Eingabe, bitte wiederholen! (Bestellemnge?) \n";
    							cin.clear();
    							cin.ignore(cin.rdbuf()->in_avail());
    
    							cin >> menge;
    						} while (menge < volumen);
    				} while (menge <= 0);
    
    				stueck = menge / volumen;
    
    				if ((menge % volumen) == 0)
    					do {
    						cout << "Der Kunde bezahlt " << stueck * preis << " EUR und bekommt " << stueck << " Fass Bier! \n";
    						menge = 0;
    					} while (menge != 0);
    
    				else if ((menge % volumen) != 0)
    					do {
    
    						cout << "Der Kunde bezahlt  " << (stueck+1) * preis << " EUR und bekommt " <<  stueck + 1 << " Fasss bier! \n ACHTUNG: " << volumen - (menge %volumen) << " Liter werden aufgrund Fassvolumens zusaetzlich geliefert und verrechnet! \n";
    						menge = 0;
    					} while (menge != 0);
    
    		cout << "Programm mit Eingabe von j neustarten. \n";
    		cin >> neu;
    		menge = 0;
    		volumen = 0;
    	}
    
    	while (neu == 'j');
    
    	cout << "Danke, dass Sie Min's Top Bierkalkulator verwendet haben! \n";
    
    }
    


  • Das bei der Eingabe über den >> Operator nur bis zu dem Zeichen gelesen wird das noch eine Zahl ist kann man nach meinem Wissen nicht abschalten. Du wirst also wohl per getline immer eine Zeile einlesen müssen und dann per stoi zu einem int konvertieren. Dort kannst du am pos Parameter sehen ob wirklich die ganze Zeile konvertiert wurde.

    Im übrigen solltest du nochmal deine Schleifen ein wenig umstrukturieren. Eine Konstruktion wie

    if(x)
    {
      do
      {
        // zeug...
      } while(x);
    }
    

    ist eigentlich ein

    while(x) { // zeug }
    


  • Danke, ich werd mir die von dir geposteten Befehle mal anschauen (kenne diese noch nicht, aber learning by doing ist ja nicht ganz so schlecht :)) und die Schleifen umbauen. Bin noch ein absoluter Laie und dankbar für jedes Feedback!



  • @TE, Was den Standard Input angeht soll std::cin.rdbuf()->in_avail() immer 0 zurückgeben, erzielt also nicht den gewünschten Effekt. Besser du benutzt std::numeric_limits<std::streamsize>::max() und ignorierst alles bis zum nächsten Zeilenumbruch, statt EOF.



  • Danke für die Hilfe. Habe mich mit dem Problem mittlerweile abgefunden. Habe allerdings eine bessere Lösung gefunden wie ich Buchstaben zurückwerfen lassen kann:

    double lang;
    char dummy;
    
    while (cin.fail()) {
    00030: cin.clear();
    00031: cin >> dummy;
    00032: cout << "Ungueltige Eingabe bitte wiederholen: " << endl;
    00033: cin >> lang;
    00034: }
    

Log in to reply