C - Problem mit "fflush(stdin); wahl = getchar();" unter OSX?

B

borsti007

Aktives Mitglied
Thread Starter
Dabei seit
24.01.2006
Beiträge
194
Reaktionspunkte
4
Kann mir jemand sagen warum der Code nicht funktioniert?

Funktioniert evtl. "fflush(stdin); wahl = getchar();" unter OSX nicht richtig?

Ich hatte es mit CoreRunner (AppStore) probiert und auch mit Xcode.

Es werden zwar zwei Werte abgefragt, aber danach macht er gleich mit dem else-Zweig weiter:

Bitte geben sie zwei Fließkommawerte ein: 3
4
Welche Operation soll ausgeführt werden:
Addition
Subtraktion
Multiplikation
Division
Ihre Wahl:
kenn ich nicht!
Das Berechnungsergebnis ist: 0.000000


---------------------------



#include <stdio.h>

main()
{
char wahl;
double wert1, wert2, ergebnis;

printf("Bitte geben sie zwei Fließkommawerte ein: ");
scanf("%lf %lf", &wert1, &wert2);

printf("Welche Operation soll ausgeführt werden:\n");
printf("Addition\n Subtraktion\n Multiplikation\n Division\n");
printf("Ihre Wahl: ");

fflush(stdin);
wahl = getchar();


if(wahl == 'A' || wahl == 'a')
ergebnis = wert1 + wert2;
else if(wahl == 'S' || wahl == 's')
ergebnis = wert1 - wert2;
else if(wahl == 'M' || wahl == 'm')
ergebnis = wert1 * wert2;
else if(wahl == 'D' || wahl == 'd')
ergebnis = wert1 / wert2;
else
{
printf("%c kenn ich nicht!\n",wahl);
ergebnis = 0.0;

}
printf("Das Berechnungsergebnis ist: %lf\n", ergebnis);


}


Jemand eine Idee?
 
Wer brachte dich auf die Idee mit fflush?
Gib im Terminal mal "man fflush" ein:
The function fflush() forces a write of all buffered data for the given output or update stream via the stream's underlying write function.
The open status of the stream is unaffected.
Stdin ist weder ein output noch update stream, entsprechend ist die Funktion fflush dafür auch nicht nützlich.
Etwas weiter unten kannst du von "fpurge" lesen, dabei handelt es sich aber um eine Funktion die afaik nicht im Standard enthalten ist und wohl nur auf manchen unixoiden Kisten funktionieren dürfe.

Richtige Lösung: http://c-faq.com/stdio/stdinflush2.html
 
Lustiges Buch, diese Formulierung ist ja schon dreist:
Sie benutzen die Funktion fflush() zum Entleeren des Tastaturpuffers. Möglicherweise gelingt dies nicht auf jedem Betriebssystem (speziell nicht unter Linux):
Das ist genau falsch herum! Nicht "möglicherweiße geht es nicht", sondern "möglicherweiße geht es". Der Standard sagt explizit, dass es nicht geht, alles andere ist eine irreguläre Ausnahme, die es zu meiden gilt.
 
Mein Buch (Das Einmaleins der C-Programmierung) ist noch aus den 90gern. Bestand das Problem so schon immer oder wurde da der Standard geändert?

Jedenfalls steht der Code da so drin.
 
Die man-page zu fflush ist zuletzt 1993 aktualisiert worden, da hat sich also nicht viel geändert.
Standards verändern sich außerdem nicht so einfach, sonst würden sie ja keinen Sinn machen. Es kann neue geben, aber alte bleiben.
 
Stichwort TERMIO


http://stackoverflow.com/questions/1798511/how-to-avoid-press-enter-with-any-getchar


Code:
#include<stdio.h>
#include <termios.h>            //termios, TCSANOW, ECHO, ICANON
#include <unistd.h>     //STDIN_FILENO


int main(void){   
    int c;   
    static struct termios oldt, newt;

    /*tcgetattr gets the parameters of the current terminal
    STDIN_FILENO will tell tcgetattr that it should write the settings
    of stdin to oldt*/
    tcgetattr( STDIN_FILENO, &oldt);
    /*now the settings will be copied*/
    newt = oldt;

    /*ICANON normally takes care that one line at a time will be processed
    that means it will return if it sees a "\n" or an EOF or an EOL*/
    newt.c_lflag &= ~(ICANON);          

    /*Those new settings will be set to STDIN
    TCSANOW tells tcsetattr to change attributes immediately. */
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);

    /*This is your part:
    I choose 'e' to end input. Notice that EOF is also turned off
    in the non-canonical mode*/
    while((c=getchar())!= 'e')      
        putchar(c);                 

    /*restore the old settings*/
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);


    return 0;
}
 
Mein Buch (Das Einmaleins der C-Programmierung) ist noch aus den 90gern. Bestand das Problem so schon immer oder wurde da der Standard geändert?

Jedenfalls steht der Code da so drin.
Der Standard wurde nicht geändert, sondern der Autor verwendet fflush() einfach nicht korrekt. Man sieht daran, dass der Buchautor Abseits von Windows wenig bis keine Erfahrung zu haben scheint. (Siehe: Bekanntes Problem)

Lies die man-Page von fflush(). Dann verwende fpurge().

Und bitte benutze Code-Tags.
 
Zurück
Oben Unten