Eingabeüberprüfung



  • Hey,

    folgendes Problem:

    Ich muss eine Zahl eingeben...soweit so leicht^^

    cin>>zahl

    diese Zahl muss einer Funktion übergeben werden..das ist auch kein problem.

    dann gehts los:
    In der Funktion soll die Zahl überprüft werden und wenn sie, keine zahl sondern ein Buchstabe ist oder eine Kommazahl ist, oder kleiner als 4 oder größer 9 ist, soll in der Funktion eine neueingabe erfolgen, wieder alle überprüfungen durcharbeiten und wenn die zahl endlich den ansprüchen genügt, soll sie zurückgegeben werden. Das zurückgeben ist jetzt auch nicht das Problem.

    //...
    int main(void)
    //...
    cin>>zahl; //eingabe
    pruef1(zahl); //übergabe an funktion
    //...
    

    so schaut die übergabe aus

    für die Kommazahl überprüfung hab ich mir sowas überlegt das von der zahl einfach die ganze zeit 1 abgezogen wird bis die Zahl am ende zwischen 0 und 1 liegt, also einen rest hat und damit eine Kommazahl ist, oder das sie ==0 ist und damit zulässig ist.
    Vom prinzip her schaut das dann so aus:

    int pruef1(int x)
    {
    int b;
    b=x;// b wird x zugewiesen da x in der funktion noch verändert wird
    while (x<4 || x>9)
    {
    cout<<"Fehler. Neueingabe\n";
    cin>>x;
    }
    while (x>=0)
    {
    x--;
    	if (x<1 && x>0)
    	{
    	cout<<"Kommazahl. Falscheingabe\n"
    	cin>>x;
    	}
    	if (x==0)
    	{
    	return(b);
    	}			
     return(0)	
    }
    

    soweit so schlecht. Jetzt ist die Frage wie Buchstaben verhinder kann und alles so zusammenfüge das es passt. Ich habe schon ein bisschen mit cin.fail() und isdigit(x) experimentiert und ihr glaub gar nicht wie gut ich endlosschleifen programmieren kann^^
    Wenn ihr mir weiterhelfen könnt wäre ich sehr dankbar.
    Grüße



  • Ich würde mit einem std::string und mit std::getline arbeiten und dann auf die Kriterien prüfen. Denn wenn man einen Buchstabe eingibt und du

    std::cin >> MeinInt;
    

    geschrieben hast, krachts.

    MfG, EOutOfResources

    EDIT:

    int pruef1(int x) 
    { 
    int b; 
    b=x;// b wird x zugewiesen da x in der funktion noch verändert wird
    ...
    }
    

    b ist nur nötig, wenn x eine Referenz oder ein Zeiger ist. Auf deine Art wird eine Kopie erstellt.



  • Das was du geschrieben hast hab ich schon mal gelesen...aber mehr auch nicht
    wenns gar nicht anders geht werde ich mich jetzt schon in solche angelegenheiten einlesen aber geht das nicht auch ein bisschen leichter? gibts da nicht doch eine möglichkeit das mit cin.fail() und cin.clear() zu machen?
    Bin noch nicht ganz so weit was c++ angeht und hab eben versucht mit meinem wissen irgendwas für die aufgabe zu basteln^^



  • Ein int kann nur ganze Zahlen aufnehmen. Keine Buchstaben und keine Kommazahlen. Wenn also etwas anderes als eine ganze Zahl eingegeben wird, kann in MeinInt gar kein sinnvoller Wert stehen.
    cin bietet dir aber an, nach dem Einlesen zu prüfen, ob denn der Nutzer eine korrekte Eingabe getätigt hat. Die Prüffunktion muss dann noch prüfen, ob die Zahl auch in dem richtigen Bereich liegt (das kann cin ja nicht wissen). Außerdem würde ich in der Prüffunktion nur die Überprüfung und nicht die Neueingabe tätigen.

    Am Ende könnte es so aussehen:

    bool pruefe(int x)
    {
        return x >= 4 && x <= 9;
    }
    
    int main()
    {
        int zahl;
        cout << "Bitte Zahl eingeben: ";
        while(!(cin >> zahl) || !pruefe(zahl)) cout << "Falsch. Neueingabe: ";
        // arbeite mit zahl
    }
    


  • #include <iostream>
    int main()
    {
      int Zahl;
      std::cin >> Zahl;
      if(std::cin.fail())
      {
        std::cin.clear();
        std::cout << "Keine ";
      };
    
      std::cout << "Zahl";
    };
    

    MfG, EOutOfResources

    EDIT: Ungetestet, Flüchtigkeitsfehler möglich



  • Hey,
    ich hab noch ein bisschen weitergesucht nachdem ich nicht auf eine lösung gekommen bin mit der ich was anfangen kann. (Danke für eure Posts)

    Aber: Ich bin hier im Forum fündig geworden und hab nen alten Code ausgegraben

    double MASSE;
        string eingabe;
        char *err_ptr = NULL;
    
        do
        {
            err_ptr = NULL;
            cout << "Bitte geben sie die Masse ein (Wert >= 10):  " << endl;
            cin >> eingabe;
            MASSE = strtod( eingabe.c_str(), &err_ptr );
        }
        while (  *err_ptr != '\0' || ( MASSE < 10) );
    
        cout << "Sie haben bombensicher einen Wert >= 10 "
            "eingegeben: " << MASSE << endl;
    

    Kann mir jemand erklären was genau da passiert? hab das für meinen Code schon umgeformt nur ich versteh nicht wirklich was genau da gemacht wird. Ich will ja wissen wie das funktioniert das ich für solche Abfragen immer ne Lösung hab.
    Wenn sich jemand findet wäre ich echt dankbar. (Er darf dann auch mal mein, jetzt fertiges Vier-Gewinnt-Spiel spiele^^)

    Lg



  • Das ist ein Gemisch zwischen C++ und C

    double MASSE;                                                         //Neue Variable deklarieren (Zahl)
        string eingabe;                                                       //Neue Variable deklarieren (Eingabe)
        char *err_ptr = NULL;                                                 //Neue Variable deklarieren (Chars die nicht zur Zahl gehören) wobei die Definition sinnlos ist
    
        do                                                                    //Schleife
        {
            err_ptr = NULL;                                                   //Nicht-Nummer-CString nullen
            cout << "Bitte geben sie die Masse ein (Wert >= 10):  " << endl;  //Antwort anfragen
            cin >> eingabe;                                                   //Eingabe aufnehmen
            MASSE = strtod( eingabe.c_str(), &err_ptr );                      //Die Eingabe in eine Zahl konvertieren (alles ab dem ersten Nicht-Zahl-Char bis zum '\0' kommt in err_ptr)
        }
        while (  *err_ptr != '\0' || ( MASSE < 10) );                         //Wiederholen wenn keine Zahl oder Masse zu klein
    
        cout << "Sie haben bombensicher einen Wert >= 10 "                    //Ausgabe
            "eingegeben: " << MASSE << endl;
    

    EDIT: Wenn eingabe "32b9\0" ist, dann ist err_ptr nach dem Aufruf von strtod "b9\0".



  • Mhhh...
    bin ich jetzt ein sehr böser Junge gewesen und komme deshalb in die Hölle oder darf man das so durchgehenlassen und ich kann mich freuen das ich mein erstes halbwegs großes Programm beendet habe?

    Ach ja: Danke für die erklärung 🙂 aber geht das noch ein bisschen mehr in richtung c++ für richtig dumme?^^

    Glaube an sich hab ichs verstanden da fehlt nur dieses *klick*



  • Thörb schrieb:

    bin ich jetzt ein sehr böser Junge gewesen und komme deshalb in die Hölle oder darf man das so durchgehenlassen und ich kann mich freuen das ich mein erstes halbwegs großes Programm beendet habe?

    Ich wäre nicht zufrieden...

    Thörb schrieb:

    Glaube an sich hab ichs verstanden da fehlt nur dieses *klick*

    Wo liegt das Problem? Wenn du es jemandem erklären müsstest, was würdest du selbst nicht kapieren/wissen/verstehen?



  • Also wenn man es wirlich einfach Step by Step durchgeht ist es ja echt nicht schwer 🙂

    Dann danke dir für deine Hilfe 🙂



  • Ich würde, wie bereits eingangs empfohlen, mit getline auf cin arbeiten, und das Parsen mit einem istringstream machen. Dann spart man sich das Problem, im Fehlerfall cin wieder aufzuräumen.

    Irgendwie so (ungetestet):

    std::string input;
    bool read_on = true;
    int result;
    std::cout << "Bitte Zahl eingeben ( 4 <= x <= 9)\n> ";
    while(read_on && std::getline(std::cin, input, '\n'))
    {
        bool input_okay = (std::istringstream(input) >> result);
        read_on = !input_okay || (result < 4) || (result > 9);
        if(read_on)
        {
            std::cerr << "Eingabe fehlerhaft.\n> ";
        }
    }
    std::cout << "Eingabe war: " << result << std::endl;
    

    Geht bestimmt auch mit weniger Zeilen...


Anmelden zum Antworten