if Wiederholung



  • Hallo,
    seit Stunden sitze ich vor demselben Problem und hoffe, dass ihr mir weiterhelfen könnt. Beim folgenden Programm wird in main, void Intro aufgerufen. Mit der Taste 1,2 oder 3 komm ich wieder zurück zu main. Sollte nun aber 45 eingegeben werden wiederholt er void so lange bis die Eingabe korrekt ist. Das funktioniert leider nicht mit Buchstaben. Sobald ich statt z.B. 1 den Buchstaben A eingebe bin ich in einer Dauerschleife. Das hat sicher mit int was zu tun aber ich komm nicht drauf. (Bin noch ein Anfänger)Beim Autofahren kommen mir die besten Einfälle.
    Zum Code:

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    int Eingabe;
    int warten;
    
    void Intro()
    {
    	cout << "Eingabe 1, 2 oder 3\n";
    	cin >> Eingabe;
    	if (Eingabe == 1)
    	{
    		cout << "Das hast du toll gemacht";
    	}
    	else if (Eingabe == 2)
    	{
    		cout << "Das hast du toll gemacht";
    	}
    	else if (Eingabe == 3)
    	{
    		cout << "Das hast du toll gemacht";
    	}
    	else
    	{
    		cout << "Fehler!\n";
    		Intro();
    	}
    }
    
    int main()
    {
    	Intro();
    	cin >> warten;
        return 0;
    }
    

    Ich hoffe dass mir wer helfen kann 😕
    Mit freundlichen Grüßen
    😃



  • Da Buchstaben keine Zahlen sind, befindet sich der Stream cin nach der Eingabe eines Buchstabens im Fehlerstatus, den du danach genau so wie den Buchstaben entfernen musst.

    Also:

    if (std::cin >> Eingabe) {
        // Eingabe einer Zahl war erfolgreich!
        ...
    } else {
        if (std::cin.eof()) {
            // wir haben das Ende erreicht, mehr kommt nicht
            return;
        }
        // ansonsten gab es eine fehlerhafte Eingabe
        // Fehlerstatus löschen
        std::cin.clear();
        // und Eingabepuffer bis zum nächsten Umbruch leeren
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    

    Übrigens hat dein Programm noch 2 andere Probleme:
    1. Globale Variablen ("Eingabe") sind böse
    2. Du rufst Intro rekursiv auf. Gib lange genug Zahlen ein und dein Programm wird eine Segmentation Violation verursachen!



  • Noea schrieb:

    ... wiederholt er void so lange ...

    Ich weiß nicht, was du dir magisches unter void vorstellst, aber das bedeutet nichts weiter als dass die Funktion (hier Intro) keinen Wert zurück liefert.



  • wob schrieb:

    Gib lange genug Zahlen ein und dein Programm wird eine Segmentation Violation verursachen!

    Argh. Ich meinte natürlich einen Stack Overflow. 🙂



  • wob schrieb:

    2. Du rufst Intro rekursiv auf. Gib lange genug Zahlen ein und dein Programm wird eine Segmentation Violation verursachen!

    Das war auch mein erster Gedanke. Stack overflow natürlich.
    Zur Not schreibe ich ein Miniprogramm, das dein Programm mit unzulässigen Eingaben bombardiert. Irgendwann kracht es und ich bin meinem Ziel ein Stück näher gekommen.
    Ja, ja - es gibt böse Leute da draussen...


Anmelden zum Antworten