scanf auf erste stelle beschränken



  • Hey, ich wollt mir nu ne kleine Abfrage schreiben.
    diese soll ich eine andere do while Schleife eingebaut werden
    Ich habe hier eine Anweisung für den Fall, dass ein ungültiges Zeichen eingegeben wird, mit eingebaut.
    Problem bei der Falscheingabe ist, dass die schleife seltsamerweise einmal leer durchläuft. Konnte mir da erst kein Rheim drauf machen.

    Bin jetz vorerst zu dem Schluss gekommen, dass mit "scanf" mehr eingelesen wird, als beabsichtigt.
    Hab das mal analysiert. Ich hab mir die "anws" sprich: das was eingegeben wird
    mal anzeigen lassen. Wenn ich jetzt z.B.: statt 'j' oder 'n' ein 'e' eingebe,
    nimmt er s mir als fehler und geht wieder an Anfang (aber ich glaub das brauch ich euch nicht wirklich erklären 😉 ).

    Statt aber jetz auf neue Eingabe zu warten, läuft er mit nem weiteren nicht eingegebenen Zeichen nochmal fehlerhaft durch die schleife.
    Laut int Ausgabe steht hier eine 10, kurz nachgeschaut und siehe da, das scanf scheint irgendwie ein LF mit aufzunehmen. Ist nur die Frage, ob das von dem Enter der eingabe stammt ?

    und da meine Anweisung in anws als char gepackt wird, dachte ich eigentlich, dass da nur eine stelle aufgenommen wird.

    GOTT, ich hoffe ihr versteht mich noch irgendwie.

    #include <stdio.h>
    
    int main () 
    {
        int gueltigkeit=0;
    do {    
        char anws;
        int abfrg;
    
        printf("\n\nweitere Berechnung ? : (j)a - (n)ein :");
        scanf("%c",&anws);
    
        if((anws == 'j') || (anws == 'J') || (anws == 'y') || (anws == 'Y') )
           {
           abfrg=0;
           gueltigkeit=1;
           }
        else if ((anws == 'n') || (anws == 'N'))
           {
           abfrg=1;
           gueltigkeit=1;
           }
        else
           {
           printf("\nEingabe ungueltig, bitte versuche es erneut\n");
           }   
    
        printf("%i\n", gueltigkeit);
        printf("%c\n",anws);
        printf("%i\n",anws);
    
    } while (gueltigkeit == 0);
    
    }
    

    Das passiert bei der Ausgabe

    weitere Berechnung ? : (j)a - (n)ein :e

    Eingabe ungueltig, bitte versuche es erneut
    0
    e
    101

    **weitere Berechnung ? : (j)a - (n)ein :
    Eingabe ungueltig, bitte versuche es erneut
    0

    10**

    weitere Berechnung ? : (j)a - (n)ein :

    Könnt ihr mir da helfen, wie ich den scanf dazu bringe nur den ersten (falschen) char zu registrieren.. ?



  • scanf ist für strings und der lf kommt von der Return-Taste.
    mach aus deinem eingabebereich ein char anws[nn] und frage anws[0] ab,
    dann sollte es gehen



  • oder ein 'getchar()' direkt nach dem 'scanf'.
    🙂



  • @Pferdefreund
    Hmm auf dem Weg war ich auch einmal gewesen, hab nur den [0] nicht abgefragt.
    Danke soweit hats zwar geklappt, aber irgendwie erst nachdem ich aus dem
    scanf("%c",&anws);
    ein
    scanf("%s",&anws);
    gemacht hab. Hab nur noch nicht so richtig verstanden, wieso es damit jetz läuft, falls mir das kurz jemand erklären mag, ich lerne halt noch :p

    @~fricky
    wie würde denn dein Beispiel aussehen und vor allem wie würde das funktionieren ?

    Dank euch erstmal, jetz kann ich wohl erstmal weiter dran arbeiten.
    Aber Unterrichtungen erhalte ich immer gern.



  • ZSchneidi schrieb:

    @~fricky
    wie würde denn dein Beispiel aussehen

    na, genau so, wie ich's gschrieben habe. erst 'scanf', direkt danach ein 'getchar' und dann weiter im text...

    ZSchneidi schrieb:

    und vor allem wie würde das funktionieren ?

    das zusätzliche getchar entfernt das '\n' aus dem stdin-buffer.
    🙂



  • Hmm ok is ne variante, werd ich mir merken.

    Dank dir.



  • Hoffe das ließt noch jemand.

    Ich hab noch n anderes kleines Problem in meinem Ablauf.
    Ich deklariere anfangs eine Variable "eingabe", in die natürlich die Eingabe in form von int geschrieben wird.

    Dann gehts wie folgt weiter:

    eine Ausgabe des wertes von "eingabe" (zur kontrolle)
    dann kommt eine if schleife in der ich z.b. eine eingegebene Zahl an eine zweite Variable übergebe zur weiteren berechnung.

    Ich printe momentan nach dieser ersten if schleife den Wert "eingabe" aus, um zu sehen, ob dieser noch verfügbar ist. Das ist hier auch noch der Fall.

    Im Programmablauf folgt aber eine else if. Wenn ich mir nach dieser schleife "eingabe" ausgeben lassen will, ist die plötzlich leer.

    int ueberg=eingabe;
            if(eingabe>=0 && eingabe<=255)
            {
            for(i=0;i<8;i++) 
                 {
                   binarr[i];
                   bina=ueberg/2;
                   binb=ueberg%2;
                   binarr[i]=binb;
                   ueberg=bina;
                 }
                /*Ausgabe Dezimal - Binär*/  
    
               printf("Binaerausgabe ist : ");  
               for(i=7;i>=0;i--)
                   printf("%d",binarr[i]);
            }
    
    //        else if(eingabe>=256 && eingabe<=65535)
    //        {
    //        for(i=0;i<16;i++) 
    //            {
    //               binarr[i];
    //               bina=ueberg/2;
    //               binb=ueberg%2;
    //               binarr[i]=binb;
    //               ueberg=bina;
    //            }        
    //            printf("Binaerausgabe ist : ");
    //            for(i=15;i>=0;i--)
    //               printf("%d",binarr[i]);
    //        }
    
    printf("\n%d\n",eingabe);
    

    die zweite Schleife ist, hier noch auskommentiert.

    Ich weiß zwar, dass variablen durchaus ihre Werte verlieren bzw. eine abhängigkeit besteht, aber ich kann mir keinen Reim drauf machen, warum dann erst nach der else.

    Und warum verliehrt hier "eingabe" seinen Wert, obwohl das eine globale Variable ist, die noch vor der if schleife gegeben wird.
    Ich dachte eigentlich, dass die dann noch verfügbar sein sollte.
    Hab momentan echt kein Plan, was der Fehler sein könnte.

    Wie kann ich jetz also nach dieser ersten Rechnung nochmal auf "eingabe" zugreifen?



  • ist die größe von binarr[] als 16 deklariert? wenn nicht, dann kann es sein, daß du beim beschreiben von binarr[] den speicher anderer variablen überschreibst. sowas nennt man einen überlauf.

    zu deiner scanf-frage. die eingabezeile der konsole besteht aus den eingegebenen zeichen und einem abschließenden new-line ('\n'). scanf("%c",&c) liest lediglich ein einzelnes zeichen ein und lässt das new-line im eingabepuffer. beim zweiten aufruf von scanf() wird dann nicht die nächste eingabe sondern erst das new-line der vorherigen eingabe eingelesen.

    wenn du scanf("%s",&answ) benutzt und answ vom typ char ist, dann bekommst du auch einen überlauf wie oben! bei "%s" muß der parameter ein zeiger auf ein char-array sein, daß groß genug ist um alle eingegebenen zeichen aufzunehmen. der speicher, auf den &answ zeigt, ist aber nur ein byte groß.



  • ZSchneidi schrieb:

    dann kommt eine if schleife...nach dieser ersten if schleife...die zweite Schleife ist...

    Hört das denn nie auf? 😞

    http://if-schleife.de/


Anmelden zum Antworten