Warum übersprint er meine zweite Eingabe?



  • Bei einem anfänglichen Taschenrechner Beispiel übersprint er immer wieder das zweite wenn ich mit Kommazahlen rechne ohne gehts:

    #include <stdio.h>
    
    int main()
    {
        double n1, n2, result;
    
        printf("Please enter the first number: ");
        scanf("%d", &n1);
    
        printf("Please enter the second number: ");
        scanf("%d", &n2);
        result = n1 + n2;
    
        printf("Your total is: %d\n", result);
    
        return 0;
    }
    

    PS: Warum geht es nicht wenn ich den "result"-Teil ganz nach oben zur Deklaration hinpacke? Wie war das nochmal??



  • "%d" ist der falsche Formatspezifizierer ('d' steht für decimal). Richtig ist "%lf" ("long float", also double), s. scanf.

    Und das Ergebnis kannst du natürlich erst dann berechnen, wenn die Eingaben vorliegen (C ist keine deklarative Sprache, sondern imperativ/sequentiell).



  • Richtig ist (immer und in jedem Fall) %f für double und nicht %lf.



  • Hast du einen Link dafür? Ich kenne natürlich die Promotion bei printf von float auf double, so daß dort "%f" und "%lf" funktionieren, aber bei scanf muß doch eine Unterscheidung bzgl. des Zeigertyps (float*, double*) getroffen werden, oder?
    Und Why does scanf() need “%lf” for doubles, when printf() is okay with just “%f”? bestätigt meine Aussage.
    Und auch scanf(3) - Linux man page sagt explizit bei "l", daß dann ein double* erwartet wird (anstatt float*).
    Oder gibt es bei C11 eine Änderung diesbezüglich?

    Edit: Und auch ideone code gibt bei "%f" danach falschen Wert aus:

    #include <stdio.h>
    
    int main(void)
    {
    	double a, b;
    
    	scanf("%f", &a);
    	scanf("%lf", &b);
    
    	printf("%f\n", a);
    	printf("%f\n", b);
    	return 0;
    }
    


  • C89 spezifiziert für *printf und double ausschließlich %f.
    Weiterhin spezifiziert C89 für Verstöße dagegen UB.
    C99 erlaubt dann %lf für *printf als äquivalent zu %f.



  • Wenn es immer noch nicht funktioniert musst du darunter schreiben fflush(stdin);
    Das ist das flushen der Eingabe muss ich immer machen da sonst da nix funzt



  • fflush(stdin) ist in ANSI C nicht definiert, weil flush nur für Output Streams Sinn macht.

    Ich finde, dass der bessere Weg um User Input zu verarbeiten ist es, zuerst mit fgetc oder fgets zu holen, schauen ob es ein \n gelesen wurde, wenn nicht nochmal fgetc bzw. fgets aufrufen bis \n gelesen wird. Nun ist die komplette Eingabe im Speicher und kann nun geparst werden, sei es mit strtok oder sscanf



  • @Wutz: ich schrieb aber von scanf bzgl. double...



  • Gerade bei ANSI C crasht es bei mir 😮

    Folgendes Beispiel:
    ICh habe mal ein Programm geschrieben, dass dein Alter anhand deines Geburtsdatums errechnen kann. Bei der Eingaben des Geburtsdatums sag es so aus:

    do{
    	printf("	  Wann bist du geboren? Gib bitte zuerst das Jahr an: ");
    	scanf("%d",&y);
    	fflush(stdin);	
    }while(y>2015||y<0);
    do{
    	printf("			    Jetzt den Monat: ");
    	scanf("%d",&m);
    	fflush(stdin);
    }while(m>12||m<0);
    do{
    	printf("			Zum Schluss bitte den Tag: ");
    	scanf("%d",&d);
    	fflush(stdin);
    }while(d>31||d<0);
    

    Hätte ich das fflush(stdin) nicht gemacht, wäre es nach der ersten Eingabe durchgelaufen und mein Programm gecrasht. 😕



  • Verschone uns bitte mit deinen falschen und inkonformen Codebeispielen.
    ANSI C und solche Codes in einem Beitrag zu verwenden sind einfach nur Schrott.
    Sie tragen nichts zur Lösung des Themas bei und sind sogar schädlich, da Leser deinen unsinnigen Code wiederverwenden könnten.



  • Uhhh da ist aber jemand wieder freundich ❤

    Tut mir außerordentlich dass ich vllt helfen konnte. Sry. 😞



  • TocToc schrieb:

    Gerade bei ANSI C crasht es bei mir 😮

    Folgendes Beispiel:
    ICh habe mal ein Programm geschrieben, dass dein Alter anhand deines Geburtsdatums errechnen kann. Bei der Eingaben des Geburtsdatums sag es so aus:

    Hätte ich das fflush(stdin) nicht gemacht, wäre es nach der ersten Eingabe durchgelaufen und mein Programm gecrasht. 😕

    Das erinnert mich eher an, wozu einen Schraubenzieher nutzen, wenn ich die Schraube mit dem Hammer auch dort reinkriege?.

    fflush(stdin) ist undefiniert, dass es bei dir per Zufall funktioniert bzw. nur weil Windows dieses undefinierte Verhalten dumm nutzt, heißt nicht, dass der Code korrekt ist. Dein Code bleibt nach wie vor falsch. Nimm denselben Code und kompiliere es für alle andere nicht Windows Plattformen und dein Code wird scheitern.

    Um ein definiertes Verhalten überall zu bekommen: fgets nutzen und dann parsen.

    // edit: das hat nicht mit Freundlichkeit oder Unfreundlichkeit zu tun, das hat nichts mit dir zu tun, sondern mit der Tatsache, dass wir in ANSI C Forum so oft mit dieser flush(stdin) Scheiße zu tun haben, egal wie man darauf hinweist, jeden Tag kommt einer mit flush(stdin)



  • Ich sag ja nur dass das eine der korrekten Lösungen für mein Problem war.
    Wäre es nicht korrekt hätte es nicht funktioniert 😃 😃



  • TocToc schrieb:

    Wäre es nicht korrekt hätte es nicht funktioniert 😃 😃

    das ist falsch. Du kannst mit einem Stein deine Haustür offnen. Das Tür-Aufmachen Mechanismus funktioniert, aber einen Stein dafür nutzen ist und bleibt eine nicht korrekte Anwendung und wenn du im Heimwerker Forum jemanden dazu räst, einen Stein anstatt den Schlüssel zu nehmen, wirst du auch eine unfreundliche Antwort bekommen.

    //edit: der Grund warum sich hier Wutz zurecht aufregt, ist dass du eine falsche Tatsache verbreitest und als korrekte Lösung presentierst, auch wenn man dir mit Tatsachen konfrontiert bleibst du dabei deine falsche Lösung anzupreisen



  • Ich hab den Command ja nicht erfunden oder?
    Der hat schon seinen Zweck, den habe ich mir nicht erdacht sondern im weiten Kindernetz gefunden und hey er funktioniert. Vllt nicht so elegant weil die Tür danach kaputt ist, aber es funktioniert. Und mein Programm geht nicht kaputt wie die Tür. 😉



  • Wie alt bist du? 12? 13?
    "Gerade bei ANSI C..." gefolgt von fflush(stdin) ist schlimmes Pfuscher-JW Niveau; du redest über Sachen, von denen du keine Ahnung hast.
    Nochmal: deine "Hilfe" ist hier unerwünscht, ob sie gut gemeint war oder nicht, ist dabei irrelevant. Schreib solche Sachen doch auf deiner Facebookseite, da stören sie wenigstens niemanden.
    Es gibt hier genug kompetente Antworter, das Forum auf Pfuscher-JW Niveau runterzuziehen durch Beiträge deiner Qualität, grenzt schon an Sabotage.



  • TocToc schrieb:

    Ich hab den Command ja nicht erfunden oder?
    Der hat schon seinen Zweck, den habe ich mir nicht erdacht sondern im weiten Kindernetz gefunden und hey er funktioniert. Vllt nicht so elegant weil die Tür danach kaputt ist, aber es funktioniert. Und mein Programm geht nicht kaputt wie die Tür. 😉

    du meine Güte, und dann wunderst du dich, warum du "unfreundliche" Antworten bekommst. Eigentlich bekommst du viel zu freundlichen Anwtorten für den Unsinn, denn du hier verzapfst 😮 👎



  • Ja liebes Wutz ich habe verstanden, dass der liebe JW kein guter Mann ist. Und ja du hast dir wahrscheinlich gemerkt, dass ich damit meine Grundlagen gelernt habe. Ändert trotzdem nix daran, dass dieser nette lieber Command mein Programm funktionierend gemacht hat. Tut mir Leid.

    Und wenn selbst wenn ich 12 oder 13 wäre ist es mein gutes Recht Antworten zu geben. "Sabotage" hin oder her.
    PS: Gönn dir ne Auszeit und such mich auf Facebook, du wirst nichts finden 🙂



  • TocToc schrieb:

    Ja liebes Wutz ich habe verstanden, dass der liebe JW kein guter Mann ist. Und ja du hast dir wahrscheinlich gemerkt, dass ich damit meine Grundlagen gelernt habe. Ändert trotzdem nix daran, dass dieser nette lieber Command mein Programm funktionierend gemacht hat. Tut mir Leid.

    ist doch scheiß egal, ob es bei dir zufällig funktioniert. Falsch bleibt falsch, und wenn du das nicht verstehen kannst/willst, dann wundere dich nicht, wenn du wie ein Idiot behandelt wirst.

    TocToc schrieb:

    Und wenn selbst wenn ich 12 oder 13 wäre ist es mein gutes Recht Antworten zu geben. "Sabotage" hin oder her.

    und genau unser gutes Recht auf Schwachsinn zu reagieren und versuchen, die Qualität der Beiträge hier hoch zu halten.



  • Ob es zufällig funktioniert
    HAHAHAHAHA genau das 😃 😃 😃 😃 😃


Anmelden zum Antworten