Wieso wird 2 mal nach der Eingabe gefragt?



  • Bei der ersten Eingabenaufforderung bei scanf() wird 2 mal nach der Eingabe gefragt, bevor man zur nächsten Eingabe kommt.
    Bin da echt am verzweifeln.

    #include <stdio.h>
    #include <math.h>
    
    float pythagora(float x,float y,float *z){
    *z = sqrt((x * x)+(y * y));
    }
    
    int main(){
    float a,b,c;
    c = 0;
    a = b = c;
    //Hier wird 2 mal nach der Eingabe gefragt, WIESO???
    puts("Geben sie a ein: ");
    scanf("%f \n",&a);
    puts("Geben sie b ein: ");
    scanf("%f \n",&b);
    pythagora(a,b,&c);
    printf("%f",c);
    return 0;
    }
    


  • Das liegt daran, dass du C für die Gestaltung von Nutzerdialogen missbrauchst.
    Die abschließenden " \n" bei deinen scanf machen nicht das, was du beabsichtigst.
    Ergänze "while(getchar()!='\n');" nach jedem scanf und das sollte erstmal laufen.



  • Das \n im Format-String von scanf sieht verdächtig aus ...


  • Mod

    Scanf ist nicht "Frag nach einer Eingabe", sondern "lies aus der Standardeingabe, bis der Formatstring abgearbeitet ist (oder das Abarbeiten scheitert)". Dein Formatstring ist "%f \n" . ' ' und '\n' sind für scanf beides Whitespace. Jeder Whitespace in scanf steht für "beliebig viele Whitespace" bei der Abarbeitung. Dein Formatstring bedeutet also "lies erst eine Fließkommazahl und dann beliebig viele Whitespaces, bis kein Whitespace kommt". Damit dies jemals zum Ende kommt, muss also nach der Fließkommazahl irgendwann erst einmal ein nicht-Whitespace eingegeben werden. Und für dich als Nutzer sieht das dann nach einer mehrmaligen Eingabeaufforderung aus, dabei ist einfach die vorherige Eingabe noch nicht fertig und blockiert daher.

    Lektionen:
    * Whitespaces am Ende eines scanf-Formatstrings sind meistens nicht, was man möchte.
    * Wahrscheinlich willst du Whitespaces am Anfang entfernen. Könntest du also einen Whitespace vor das %f schreiben. Aber %f beinhaltet aber auch schon beliebig viele Whitespaces am Anfang, daher kann man sich das auch sparen.
    * Der von dir eigentlich gewünschte Formatstring ist daher wohl einfach "%f" .
    * All dies kannst und solltest du in Referenzen zu scanf nachlesen. Offenbar hast du derzeit noch falsche Vorstellungen von scanf, daher ist dies dringend zu empfehlen. Insbesondere ist der scanf-Formatstring nicht das Gegenteil von printf!


Anmelden zum Antworten