Vernünftige Eingabeüberprüfung!



  • Hiho alle 🙂

    bin neu hier im Forum und hab direkt eine Frage 😃

    es geht um eine vernünftige Eingabeüberprüfung. Ich zeige euch mal, was ich mir bis jetzt so erdacht habe:

    printf("Bitte geben Sie die Basis der Zahl ein: ");
    flag = 0;
    do {
       check = scanf("%u", &basis);
       if(basis >= 2 && basis <= 9 && check == 1)
          flag = 1;
       else {
          printf("Ungueltige Eingabe!\n");
          printf("Bitte geben Sie die Basis der Zahl erneut ein: ");
       }
    } while( !(flag));
    

    so jetzt als Beispiel. Konkret geht es bei dem Programm um einen Zahlenkonverter von einer Basis in eine andere Basis (eher son Einsteigerprogramm, hoffe ich langweile euch damit nicht xD)

    Naja, soweit funktioniert das Ganze auch wohl. Er fängt Zahlen die außerhalb vom Intervall 2-9 stehen natürlich ab. Nur eigentlich wollte ich auch, dass der so unsinnige Eingaben wie "a" oder "0.1" abfängt.

    Ich hätte gedacht, dass das mit dem Rückgabewert der scanf Funktion schon abgefangen wird, aber sobald ich da solche Sachen eingebe, läuft das Programm in einer Endlosschleife.

    Ich nehme dann mal an, dass man das so dann eben nicht machen kann xD
    aber wie macht man das denn dann? Also dass der so Sachen wie Buchstaben oder float-Werte von vornherein abfängt?

    mfg Frat



  • Probier mal, vor jeder Benutzereingabe den Eingabepuffer zu leeren, zum Beispiel so:

    char c;
    while ((c = getchar()) != EOF && c != '\n');
    

    Das sollte die Endlosschleife verhindern.



  • alles klar, hab einfach hinter scanf dann

    while(getchar() != '\n')
    

    hintergesetzt und die endlosschleife wird unterbunden. danke für die hilfreiche antwort 😃

    mfg Frat



  • Frat schrieb:

    alles klar, hab einfach hinter scanf dann

    while(getchar() != '\n')
    

    hintergesetzt und die endlosschleife wird unterbunden. danke für die hilfreiche antwort 😃

    mfg Frat

    was macht das bei EOF das loopt sich nen ast, weil du es eben nicht kopiert hast...



  • sowas hab ich ja aucg schon lange gesucht :D:D:D
    aber jetz mal meine frage....kann mir jemand erklärn wie das gnau funktioniert...zb was beudetet in dem fall '\n' ... ein zeilenumbruch in ' '?!? 😕 😕 😕



  • Friek schrieb:

    ...was beudetet in dem fall '\n' ... ein zeilenumbruch in ' '?!? 😕 😕 😕

    Bingo, Bruder! Die Funktion scanf hat die Angewohnheit, das '\n' Zeichen nach einer Eingabe im Eingabepuffer zu lassen. Es können sich bei einer fehlerhaften Eingabe auch noch andere Zeichen vor dem '\n' Zeichen im Puffer befinden, z.B. wenn in deinem Fall statt einer Zahl ein Buchstabe eingegeben wurde. Dieser Buchstabe wird von scanf im Puffer gelassen, weil er der Angabe im Formatstring nicht entspricht. Die while Schleife wird also solange ausgeführt, bis das letzte Zeichen ( das ist das '\n' ) aus dem Puffer gelesen und entfernt wird. Mit dem Einlesen des '\n' ist er Puffer leer, die Schleife wird beendet.

    int main () {
    	int num=0, ret=0;
    	char c=0;
    	printf("Eine Ganzzahl eingeben und Enter druecken: ");
    
    	if ( 1 != ( ret = scanf ( "%d", &num )))
    		puts ("Das war keine Ganzzahl du Vogel!");
    	else
    	// Bei der korrekten Eingabe einer ganzen Zahl( keine weiteren Zeichen nach der Ganzzahl )
    	// wird hier das '\n' Zeichen, also der Zeilenumbruch eingelesen.
    		c = getchar();
    
    	if ( c != '\n' || ret != 1 )
    		puts ("Abnormal program termination due to user stupidity!"), exit(1);
    	else
    		puts ("Program terminated normally.");
    
    	return 0; 
    }
    

    Gruß,
    B.B.



  • ahhh vielen dank...das scanf was im puffer lässt muss ich mir merkn 😃 😃


Anmelden zum Antworten