double eingabe auf buchstaben prüfen



  • Hallo,
    ich bin ein absoluter C++ Anfänger.
    Ich habe folgendes Problem:
    Ich möchte bei meinem einfachen Programm was Fläche und Umfang von einem Quadrat berechnet mithilfe von double werten die vom Benutzer eingegeben werden prüfen ob das eingegebene auch wirklich Zahlen sind.
    Habe schon eine einfach Prüfung Programmiert die nach nach Buchstaben von a - z und A - Z prüfen SOLLTE, aber die prüft nur nach dem ASCII wert dahinter. Also wenn ich a eingebe wird kein Fehler geworfen sondern nur wenn ich die 97 (ASCII Wert von a) eingebe.
    Falls möglich würde ich das gerne ohne besondere Funktion oder sowas wie z.B atoi lösen.



  • Code:

    #include<iostream>;

    int main() {

    double eingabe = 0, flaeche = 0, umfang = 0;
    
    
    	do {
    		std::cout << "Bitte geben Sie die Seitenlaenge ein (in cm): ? ";
    		std::cin >> eingabe;
    
    		if (eingabe >= 'a' && eingabe <= 'z' || eingabe >= 'A' && eingabe <= 'Z') {
    			std::cout << "Falsche Eingabe! Bitte erneut eingeben." << std::endl;
    		}
    	} while (eingabe >= 'a' && eingabe <= 'z' || eingabe >= 'A' && eingabe <= 'Z');
    
    flaeche = eingabe * eingabe;
    umfang = eingabe * 4;
    
    std::cout << "Der Umfang des Quadrats betraegt (in cm): " << umfang << std::endl;
    std::cout << "Die Flaeche des Quadrats betraegt (in cm*cm): " << flaeche << std::endl;
    
    system("pause");
    return 0;
    

    }


  • Mod

    Vergiss die ganze Idee. Ein double kann nie einen Buchstabenwert haben, daher schlägt std::cin >> eingabe; in dem Fall einfach fehl. Und das ist genau das, worauf du prüfen solltest, wenn du wissen möchtest, ob eine Eingabe erfolgreich war oder nicht.

    Die Frage ist dann natürlich, was du im Falle eines Falles mit einem solchen Buchstaben machst. Die Eingabefunktion ist schließlich fehlgeschlagen, hat den Buchstaben im Eingabestream gelassen, und wenn du es einfach noch mal versuchst, wird sie direkt wieder fehlschlagen. Die übliche Art und Weise, damit umzugehen, ist, den Buchstaben mit ignore zu verwerfen.

    Insgesamt zum Beispiel in dieser Art:

        #include <iostream>
        using namespace std;
         
        int main() {
          double d;
          while(!(cin >> d))
          {
          	cin.clear();
          	cin.ignore();
          }
          cout << "Das war ein double: " << d << '\n';
        }
    

    https://ideone.com/S2Wghc



  • Hi,
    operator>> versucht, die Daten (also deine Eingabe) aus dem Stream (cin) in eine Variable (eingabe) zu schreiben. Der Operator weiß, was für ein Datentyp erwartet wird (double). Im Stream steht aber kein double, und damit geht das Stream Objekt in einen Fehlerzustand über. Das heißt, cin ist in einem Fehlerzustand, wenn du keine Zahl eingibst. Somit brauchst du einfach nur das Stream Objekt zu überprüfen:

    cin >> eingabe;
    if( !cin )
    {
       // Fehler
    }
    


  • Ok ich habe es jetzt. Danke euch beiden 🙂
    Code:
    #include<iostream>;

    int main() {

    double eingabe = 0, flaeche = 0, umfang = 0;
    bool kontrolle = true;
    
    do {
    	std::cout << "Bitte geben Sie die Seitenlaenge ein (in cm): ? ";
    	std::cin >> eingabe;
    
    	if (!std::cin) {
    		std::cout << "Falsche Eingabe! Bitte erneut eingeben." << std::endl;
    		std::cin.clear();
    		std::cin.ignore();
    		kontrolle = false;
    	}
    	else {
    		kontrolle = true;
    	}
    } while (!kontrolle);
    
    flaeche = eingabe * eingabe;
    umfang = eingabe * 4;
    
    std::cout << "Der Umfang des Quadrats betraegt (in cm): " << umfang << std::endl;
    std::cout << "Die Flaeche des Quadrats betraegt (in cm*cm): " << flaeche << std::endl;
    
    system("pause");
    return 0;
    

    }



  • @seppj Eine Frage zum Verständnis noch:
    cin.clear() leert den stream ja wenn ich es richtig verstanden habe.
    Was macht aber cin.ignore() ?



  • Mit clear() machst wieder alles good. Mit ignore() ignorierst du alle bestehenden Zeichen bis hin zu EOF (end of file)



  • @spiri achso ok jetzt habe ich es verstanden, danke. 🙂



  • Jetzt nochmal zum Abschluss:
    Diese Kontrollstruktur die ich jetzt habe kann ich doch universell einsetzen, also für eingabe = strings, bool, int etc. weil der ja schon weiß was für ein richtiger Wert ankommen sollte beim cin und ja den stream überprüft oder habe ich das jetzt falsch verstanden ?


  • Mod

    @spiri sagte in double eingabe auf buchstaben prüfen:

    Mit clear() machst wieder alles good. Mit ignore() ignorierst du alle bestehenden Zeichen bis hin zu EOF (end of file)

    Nein, es ignoriert ein Zeichen. Oder so viele man angibt. Oder unendlich viele, wenn man den Sonderwert numeric_limits<streamsize>::max() angibt. Und bei allen drei Möglichkeiten stoppt es beim auch angebaren Delimiter. Der ist dann standardmäßig das Ende eine Datei, kann aber jedes beliebige Zeichen sein.

    @proggingneuling sagte in double eingabe auf buchstaben prüfen:

    Jetzt nochmal zum Abschluss:
    Diese Kontrollstruktur die ich jetzt habe kann ich doch universell einsetzen, also für eingabe = strings, bool, int etc. weil der ja schon weiß was für ein richtiger Wert ankommen sollte beim cin und ja den stream überprüft oder habe ich das jetzt falsch verstanden ?

    Ein bisschen umständlich. Solltest du später mit mehr Erfahrung nochmal überdenken. Aber ja: Geht mit allem. Wobei string halt nicht wirklich Sinn macht, denn was soll bitte ein ungültiger String sein? Ein String kann alle Folgen von Zeichen aufnehmen.



  • This post is deleted!


  • @proggingneuling Kannst du die codetags richtig setzen? Ich glaub bei dir sind die einleitenden ``` in den code gerutscht. Sieht etwas seltsam aus... Unten rechts unter deinem Posting sind 3 Punkte, in dem Aufklappmenü kannst du Bearbeiten auswählen... Danke!


Log in to reply