@C1yde: Deje sa to preto, lebo: V prvom scanf nacitas float a stlacis enter ( to je znak, cize char ), obe sa ulozia do buffera. Nasledne sa do premennej
i ulozi nacitane cislo z buffra a znak enter zostane v bufferi. Potom znova nacitavas float a kedze v bufferi je iba char, nie float, tak si vyzvany na vstup. Znova vlozis float, stlacis enter a obe sa ulozia v bufferi ( uz tam mame char enter, float a znova char enter. Prvy float uz je vybraty a ulozeny v premennej, cize tam nie je ). Nakoniec volas treti scanf, kde nacitavas znak ale v bufferi uz jeden mas ( ten posledny stlaceny enter ), cize nebudes vyzvany na vstup z klavesnice ale rovno sa ti do premennej
c vlozi znak noveho riadku ( enter ).
Ja neodporucam volat fflush na stdin, pretoze to je tzv nedefinovane spravanie (undefined bahavior). Nemusi to korektne fungovat na vsetkych kompileroch a Cecko nema iba jeden kompiler a nebezi iba na jednom OS, na to treba mysliet. Skor odporucam tam, kde pracujes so znakmi, pripadne retazcami, pouzit v predchadzajucom scanf argument c s hviezdicku, takto:
%*c
Priklad:
Kód:
printf("Zadaj cislo\n");
scanf("%f", &i);
printf("Zadaj 2 cislo\n");
scanf("%f%*c", &j); /* za tymto scanf volas dalsi, kde nacitavas znaky, cize tuna vloze %*c */
sucet = i + j;
printf("Zadal si cisla %f a %f, ich sucet je %f\n", i,j,sucet);
printf("Zadaj znak\n");
scanf("%c%*c", &c); /* tuna uz nemusis, lebo tu program konci, ale tak na skodu tu nebude, taktiez ani v prvom scanf */
Alebo si napis vlastnu funkciu na vyprazdnenie vstupneho buffra, napriklad ako je popisane tu
http://c-faq.com/stdio/stdinflush2.html
Zaroven si prezri tuto temu, tu sa to riesilo taktiez a popisoval som to tam hlbsie:
http://www.pcforum.sk/nefungujuci-fgets-vt127550.html