Problem mit dem Puffer



  • Hallo habe folgendes Problem:
    dies soll ein Taschenrechner werden, allerdings wird die scanf für den Rechenoperator immer übersprungen 😕

    Könnt ihr mir helfen? Habs schon mit fflush hinter den scanf's probiert, aber hat nicht geklappt. Soll ein Taschenrechner werden aber hier mal nur der Ausschnitt der nicht funktioniert.

    double z1 , n1 , z2 , n2 ;                   
        char rz;
    
            // Einlesen von Zähler und Nenner (1)!
        	printf("1.Zahl Zaehler: ");
    		scanf("%lf", &z1);                         
        	printf("1.Zahl Nenner: ");
    		scanf("%lf", &n1);   
    
    			//Überprüfen ob Nenner = 0   
    
                while(n1 == 0)
                {
                    printf("Durch 0 nicht teilbar!\n");						
    				printf("1.Zahl Nenner erneut eingeben: ");
    				scanf("%lf", &n1);   
    
                }                                                 
    
    		// Einlesen von Zähler und Nenner (2)!
    		printf("2.Zahl Zaehler: ");
    		scanf("%lf", &z2);                         
          	printf("2.Zahl Nenner: ");
    		scanf("%lf", &n2);                        
    
    			// Überprüfen ob Nenner = 0
                while(n2 == 0)
                {
                    printf("Durch 0 nicht teilbar!\n");
    				printf("2.Zahl Nenner erneut eingeben: ");
    				scanf("%lf", &n2); 
                }                                                             
    
    		// Rechenzeichen einlesen
    		printf("Rechenzeichen: "), scanf("%c", &rz);  fflush(stdin);
    


  • Letzte Zeile. Hinter printf ist ein Komma. Das sollte wohl ein semikolon sein.



  • oh danke, gar nicht gesehen, scanf Abfrage vom Rechenzeichen funktioniert leider trotzdem nicht



  • Bleibt er hängen oder liest er was falsches ein?
    Wenn er was falsches einliest wäre interessant was.



  • Hab grad ne Ausgabe gemacht: Er ließt einen Zeilenumbruch ein.
    Dachte das würde durch fflush korrigiert werden?



  • Verwende Mac als OS .. Kann dass das Problem sein? Funktioniert auf Windows??



  • scanf(" %c", &rz);
    

    Das Leerzeichen vor dem % ist wichtig!



  • Ja klasse 😃 jetzt funktionierts ..
    Warum ist da s Leerzeichen so wichtig?



  • Weil es sog. Whitespace überliest. Dazu zählen Leerzeichen ' ', Tabulatoren '\t' '\v' und auch Zeilenvorschub '\n', Wagenrücklauf '\r' und Seitenvorschub '\f'.

    Die meisten anderen Formatspecifier überlesen führende Whitespace von selber, aber %c eben nicht.

    http://www.cplusplus.com/reference/clibrary/cstdio/scanf/


  • Mod

    colorpixel schrieb:

    Dachte das würde durch fflush korrigiert werden?

    Wenn du damit fflush(stdin) meinst: Nein. fflush auf Eingabestreams erzeugt undefiniertes Verhalten, oft geht danach gar nichts mehr. Auf einer einzigen Konsole (der Windowskonsole) ist es ein Feature, dass da durch der Eingabepuffer der Konsole geloescht wird. Ueberall sonst geht das nicht und es ist daher eine gute Idee, dies nicht in standardkonformen Programmen zu benutzen (und stattdessen eben scanf richtig zu nutzen). Dann funktionieren die Eingaben auch, wenn der Nutzer sie per Morsezeichen an den Mikrocontroller in einer Waschmaschine sendet, anstatt nur, wenn der Nutzer eine Tastatur und die Windowskonsole nutzt.



  • colorpixel schrieb:

    Dachte das würde durch fflush korrigiert werden?

    Der zeitliche Ablauf spielt dabei auch eine Rolle.

    Nur weil du alles in eine Zeile schreibst, passiert das nicht gleichzeitig.


Log in to reply