[C] Czy fflush konieczne przy getchar ()?

Pisząc maly programik typu kalkulator, do którego kod znajdziecie poniżej napotkałem na pewien problem:

#include 

int main ()

{

char znak;

float nb1, nb2, resultat;

printf("1 liczba:\n");

scanf("%f", &nb1);

printf("2 liczba:\n");

scanf("%f", &nb2);

printf("\n=== znak===\n\n");

printf("1. '+'\n");

printf("2. '-'\n");

printf("3. '/'\n");

printf("4. '*'\n");


fflush(stdin); 

scanf("%c",&znak);


switch (znak)

{

      case '+': resultat = nb1 + nb2;

      break;

      case '-': resultat = nb1- nb2;

      break;

      case '/': resultat = nb1 / nb2;

      break;

      case '*': resultat = nb1*nb2;

      break;

      default: printf("Vous avez choisi une mauvaise operation\n");

       }


 printf("Resultat de %.2f %c %.2f = %.2f\n", nb1, znak, nb2, resultat);


 system("pause");

  return 0;



}

Jak wida program pyta o:

  1. 1 liczbę + scanf

  2. liczbę + scanf

  3. znak działania + ??? i tutaj hmm. przechodzi od razu do rezultatu, nie czekając na wybór użytkownika. Szukałem trochę w necie i dopisałem “fflush (stdin)” i program dziabie jak malina. Z czego jednak wynika koniecznośc stosowania fflush w tym przykładzie? - to tak jak pominac jakikolwiek scanf, a to mi sie nigdy jeszcze nie przydażyło.

Chodzi o to, że w buforze został znak nowej linii (\n) i scanf("%c",&znak); wczytuje właśnie ten znak. Jeśli jednak dasz jeszcze raz wczytanie znaku to już będzie ok i poczeka na to co chcesz wpisać(czyli działanie).

Skoko, dzięki- dałem jednak ‘s’ na miejsce c w scanf:

scanf("%s",&znak);

i to załatwilo sprawę. :smiley:

No nie za bardzo:) masz wyciek pamięci… %s to wczytywanie napisu, czyli kilku znaków.

spróbuj

scanf("\n%c",&znak);

to spowoduje że zostanie wczytany znak po znaku nowej linii

:lol: - as the expest says — it works !