Erkennung ungültiger Werte bei scanf-Eingabe



  • Hi Zusammen

    Ich schreibe ein kleines Mathematikprogramm für die Konsole. Nun möchte ich nach der Eingabe (scanf) überprüfen ob mein Wert "kompatibel" ist. Die Anforderung ist eigendlich das der Wert Numerisch,Ganzzahlig und Positiv ist.

    Ganzzahlig habe ich bereits gemacht.

    y=b; //y=int und b=float
    b=b-y;
    while (b>0)
    { UND SO WEITER

    Positiv ist ja an und für sich auch kein Problem, aber wie kann ich mit einfachen Mitteln testen, ob es sich um einen Nummerischen Wert handelt? Grundsätzlich kann ich "irgendwas" reinschreiben und mein Progrämchen rechnet tapfer weiter...

    Ah ja,,eine weitere Anforderung. Es darf ausschliesslich stdio.h verwendet werden und nur reiner C code

    Vielen Dank für die Gehelf

    Greets Scriptkiddy



  • scanf() und Konsorten hat doch ein ganzes Paket an Formatbeschreibern für alle möglichen Formate, z.B. %d (ganzzahlig) oder %f (numerisch) - wenn deine Eingabe nicht dort reinpasst, wird sie gar nicht erst verarbeitet und du kannst den Rückgabewert der Funktion auswerten (wenn der nicht gleich der Anzahl der einzulesenden Variablen entspricht, gab's ein Problem).

    int count = scanf("%f %f",&x,&y);
    if(count != 2)
      printf("Fehler bei Eingabe - %d Werte erkannt\n",count);
    else
    {
      //Werte verarbeiten
    }
    

    (PS: "positiv" kannst du mit der Abfrage "x>=0" überprüfen)



  • Hallo, thx für deine Hilfe.

    Ich habe aber in der Zwischenzeit eine andere Lösung gefunden. Da meine while-schlaufen ins Endlose gegangen sind, sobald ich "Veloständer" eingegeben habe, habe ich einen Eingabepuffer-Löscher eingebaut --> fflush(stdin);

    Und siehe da,,,es funtzt. 💡

    Hier noch meinen Code falls jemand Intresse hat.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    
        float b; //Hilfsvariable
        int a;   //Hilfsvariable
        int y;   //Wert für die Eingabe
        int x;   //Wert ivertiert (zb. bei y=100, x=1)
        int z;   //Variable für die Summe
    
        z=0;
    
        printf("Bitte Aufloesung eingeben.\n");
        scanf("%f",&b);
    
    // Kontrolle der Eingabe -------------------------------------------------------
    
        y=b;
        b=b-y; 
    
        while (y<=0)         //Negativwert oder 0                                                                                                                                                                  
                       {         
                                 fflush(stdin);
                                 printf("\n\nIhre Eingabe war falsch1.");
                                 printf("\n\n\nBitte Aufloesung eingeben.");
                                 scanf("%f",&b);
                                 y=b;
                                 b=b-y;                           
                       }    
    
        while (b>0)         //Nicht ganzzahliger Wert
                       {         
                                 printf("\n\nIhre Eingabe war falsch2.");
                                 printf("\n\n\nBitte Aufloesung eingeben.");
                                 scanf("%f",&b);
                                 y=b;
                                 b=b-y;                                                 
                       }    
    
    // Mathematische Lösung nach Gaus-----------------------------------------------
    
        a=y;   
    
        for (x=1;x<=y;x++)
    
                          {      
                                 z=x+a+z;
                                 a=a-1;
                          }
    
        z=z/2;
    
        printf("\n\nDas Resultat lautet:  %d\n",z);
        printf("--------------------\n\n",z);
    
      system("PAUSE");	
      return 0;
    }
    

    greets Scriptkiddy



  • Kleiner Tip von einem Experten: Vergiss diese "Lösung" schnell wieder - "fflush(stdin)" ist, kurz gesagt, Nonsens. Stattdessen kannst du so etwas verwenden:

    void ignore(FILE* f,char delim);
    {
      while(!feoe(f) && fgetc(f)!=delim);
    }
    
    ...
    ignore(stdin,'\n');
    ...
    

    PS: Und ganzzahlige Werte kannst du auch direkt einlesen:

    fscanf("%d",&y);
    


  • CStoll schrieb:

    PS: Und ganzzahlige Werte kannst du auch direkt einlesen:

    fscanf("%d",&y);
    

    Hm. Mein Compiler meckert da.
    Er will

    int y;
    fscanf(stdin, "%d", &y);
    

    Frage: Ist mein Compiler schrottig, oder wie gehörts denn nun? 😕
    (Ich verwende momentan BCC5.5)

    Also laut dem hier:
    http://www.cplusplus.com/ref/cstdio/fscanf.html
    sollte das schon so halbwegs passen mit dem stdin.

    Kenn mi nix aus :p



  • Dein Compiler ist nicht schrottig! 😃

    Entweder

    fscanf(stdin, "%d", &y);
    

    oder

    scanf("%d", &y);
    

    Edit: fscanf(...) ist halt gedacht um aus Dateien/Streams ungleich der stdin zu lesen.



  • Hallo Leute!

    Lustig, ich schreibe auch gerade an einem Math-Programm und wolte soeben genau die selbe Frage stellen:

    Ich arbeite gerade an Thermen mit Klammern.

    was ich möchte ist, dass wenn die erste eingabe keine zahl ist (was ich überprüfen können möchte)der wert in ne char variable eingelesen wird.

    Die einzige Möglichkeit die ich kenne ist ungets?

    Hier meine Frage:

    Kennt jmd eine andere möglichkeit als ungets?

    Kann mir jmd zu ungets oder der anderen möglichkeit einen codeschnipsel zeigen?

    geht das mit if (a= int (a)) oder so?

    Vielen Dank



  • Am besten du liest erstmal in einen String und prüfst dann ab.

    int zahl;
    char buffer[80];
    gets(buffer);
    if (sscanf(buffer, "%d", &zahl) == 1) {
      // Na prima; user hat eine Zahl eingegeben
      ...
    } else {
      // Was sitzt denn da für ein Trottel vor dem Monitor :-(, egal
      char c = buffer[0];
      ...
    }
    


  • sorry aba das check ich nicht, gibts da auch was ohne strings??
    irgendeiner hat mal so gschrieben dass man nen abgleich so wie oben bereits beschrieben ausführen kann,prich mit: if (a=int (a)) oda so

    Is echt wichtig da ich sonst nicht weiterkomme.

    Oder hat jmd ne andere lösung?

    ich will wissen ob die eingaben ne klammer oder zahl ist.

    Thx



  • parserbau, regulaere ausdruecke, context free grammars, parsing expression grammars, baeume, finite state machines,...

    such dir was raus und fang mit lesen an, wenn du selbst einen string zu einem einen mathematischen ausdruck umformen willst.

    hier etwas, das ich dazu gefunden hab:
    http://www.codeproject.com/cpp/craf...erpreter_p1.asp
    http://www.codeproject.com/cpp/craf...erpreter_p2.asp
    http://www.codeproject.com/cpp/craf...erpreter_p3.asp

    codeproject hat hauptsaechlich miese codes, aber dieser dreiteiler hat tiefe.

    [ hinweis: dieser post ist identisch mit http://www.buha.info/board/showpost.php?p=370269&postcount=4 ]



  • Und dadurch sind die Links fehlerhaft kopiert worden.



  • da is kein projekt mehr, aba danke



  • k, es gibt ne ganz simple lösung

    if (a==(float)a) und so weiter mit diesen abfragen in verschidenster zweierkombination ermöglichen mir das zu kontrollieren etc thx problem gelöst.

    Das parsing dings hat so ziemlich gar nix geholfen weil es gar n soviel aufwand bedarf.



  • Javaner schrieb:

    Dein Compiler ist nicht schrottig! 😃
    *snip*

    Stimmt, eher die Implementierung der Standardlib, wenn es nicht wie beschrieben funktioniert hätte. Oder?
    Muss mich da erst mal zurechtfinden.



  • Nein, auch die ist nicht schrottig. CStoll hat sich einfach vertippt.



  • Es geht mir nicht darum, ob sich wer vertippt habe, sondern darum, ob ich einen "Fehler" richtig erkennen und einordnen konnte. Ich bin so ein neugieriger Egoist, ich weiss 😃


Anmelden zum Antworten