Scanf Fehlerbehandlung



  • Hallo,

    bastle gerade an einer Funktion, welche bestimmte int-Werte einliest. Sitze nun an der Fehlerbehandlung. Habe die Funktion auch schon so weit, dass sie Buchstaben ignoriert sowie Zahlen, die sich nicht in einem bestimmten Bereich befinden. Was mir Probleme macht, sind die Eingaben wie z.B. "3xxx", "2xab".
    Jene Eingaben, bei denen Buchstaben nach einer Zahl auftauchen. Diese übernimmt er einfach, was ja auch logisch ist, da scanf nur das Erste "korrekte" Zeichen registriert und alles was danach kommt ignoriert.

    int readint(const char msg[], int lower, int upper)
    {
       int eingabe = 0;
       int rc      = 0;
       int n       = 0;
    
       printf("\n%s", msg);
    
       n = scanf("%i", &eingabe);
       while(getchar() != '\n');
    
          if (eingabe < lower || eingabe > upper || n == 0)
             rc = 0;
          else
             rc = eingabe;
    
       return rc;
    }
    

    Wäre klasse wenn jemand einen Denkanstoss liefern könnte.

    Gruß



  • Ich würde Eingaben erst gar nicht mit scanf machen. Lieber mit fgets und dann den ergebnisstring auf Herz und Nieren checken, je nachdem was eingegeben werden soll. Teilweise ist das auch nur auf Stringbasis machbar.



  • Hallo,

    danke für den Tipp. Habe es mit fgets gelöst. Vielleicht nicht die Eleganteste Art, aber für meine Zwecke soll sie reichen.

    int readint(const char msg[], int lower, int upper)
    {
       enum {FALSE, TRUE};
       int eingabe = 0;
       int rc      = 0;
       int n       = 0;
       int i       = 0;
       int k       = 0;
       int fehler  = FALSE;
       char string[5];
    
       printf("\n%s", msg);
    
       fgets(string, 5, stdin);
       k = strlen(string);
    
       while (string[i] != '\n' && i < k) {
    
          if (isalpha(string[i]))
             fehler = TRUE;
    
          i++;
       }
    
       fflush(stdin);
       eingabe = atoi(string);
    
          if (eingabe < lower || eingabe > upper || fehler)
             rc = 0;
          else
             rc = eingabe;
    
       return rc;
    }
    

    Danke nochmal!


Anmelden zum Antworten