Fehlerbehandlung soll nur eingabe von int-Datentyp erlauben



  • Hallo,

    stehe vor einem Problem und zwar möchte ich innerhalb einer Wertabfrage in der int-Datentypen eingelesen werden sollen auch nur diese erlauben, d.h. es soll eine entsprechende Fehlermeldung erscheinen, wenn ein oder mehrere Buchstaben eingegeben werden. Wie lege ich fest wann es sich um einen Buchstaben oder eine Zahl handelt?

    Bsp: Wenn nur ein bestimmter Bereich abgefragt werden soll:

    if(MAX > 10 || MIN < 1)
       printf("Nein nein nein, das darf nicht sein\n");
    

    Das ganze jetzt eben nur wenn ein Buchstabe statt der Zahl eingegeben wird.

    Danke!

    Gruß



  • Ich würde zuerst einen String mir man: fgets einlesen, danach das '\n' im String entfernen. Dann kann man mit man: isdigit durch den String iterieren um festzustellen, ob nicht-Ziffern eingegeben wurden. Eine andere Variante wäre, den String mit man: strtol umzuwandlen und dessen Fehlerbehandlungsmöglichkeit (char **endptr) zu nutzen.



  • scanf() liefert zurück, wieviel von der Eingabe es erkennen konnte. Und wenn du ein Zahlenformat angibst, verarbeitet es automatisch nur Zahlen-Eingaben:

    int val;
    while(1)
    {
      int ct = scanf("%i",&val);
      if(ct!=1)
      {
        printf("Falsche Eingabe\n");
        while(getch()!='\n');//das falsche Zeichen steht noch im Eingabepuffer
      }
      else break;
    }
    


  • Ich würd einfach so vorgehen:

    int i;
    int erg = scanf("%d", &i);  //scanf gibt die Anzahl der erfolgreich eingelesenen Variablen zurück
    
    if (erg != 1) 
      perror(""Nein nein nein, das darf nicht sein\n");
    


  • Okay, danke, Problem nach langem hin und her gelöst. Folgendes verstehe ich nicht ganz.

    do {
             printf("Wert # %i: ", i+1);
             p = scanf("%f", &werte[i]);
    
             while((getchar()) != '\n');
    
             if(p != 1)
                printf("\nBitte nur Zahlen eingeben!\n\n");
             else if(werte[i] > MAX || werte[i] < MIN)
                printf("\nUngueltiger Bereich!");
    
             i++;
    
          } while (i != n);
    

    Will diesen Kontrollmechanismus auch hier anwenden. Eingelesen werden sollen eine vorher bestimmte Anzahl von Werten (n). Wenn ich nunmehr hier Buchstaben statt Zahlen eingebe, erscheint zwar eine entsprechende Meldung, aber durch das i++ wird weiter inkrementiert. In der Praxis sieht das so aus:

    So sollte es richtig aussehen:

    Wert #1: 12
    Wert #2: 2
    Wert #3: 3

    So erscheint es bei mir, nach einer Fehleingabe von zwei Buchstaben:

    Wert #1: a
    Wert #2: c
    Wert #3: 2

    anstelle von

    Wert #1: a
    Wert #1: a
    Wert #1: 1
    .
    .
    .

    Ich hoffe ihr versteht was ich meine.

    Gruß



  • Du kannst die Schleife mit 'continue' vorzeitig zum Anfang zurückschicken (oder mit 'break' vorzeitig verlassen). Oder du setzt einfach ein 'else' vor das i++ (dann wird es nur dann ausgeführt, wenn keiner der vorigen if()-Zweige ausgelöst hat).



  • Vielen Dank, irgendwie hätte ich da selbst drauf kommen müssen.

    Gruß


Log in to reply