IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nefunguje scanf

Aktivity
Avatar
informatik87
Člen
Avatar
informatik87:20.11.2014 14:38

Zdravím, nevíte někdo proč se v kódu (viz. níže) provede po zadání poloměru koule ihned podmínka a nečeká se na načtení znaku do proměnné vyber? Vypadá to tak, že se do proměnné vyber uloží enter ze zadání poloměru. Ale jak to opravit, aby program běžel správně?

#include <stdio.h>
#include <math.h>

int main(void)
{
    float r, vysledek;
    char vyber;
    printf("Zadej polomer koule: ");
    scanf("%f", &r);
    printf("Pro vypocitani objemu zadej v a obsahu s: ");
    scanf("%c", &vyber);

    if (vyber == 'v' || vyber == 'V') {
        vysledek = (4 / 3) * M_PI * pow(r, 3);
        printf("Vysledek objemu = %f", vysledek);
    }
    else if (vyber == 's' || vyber == 'S') {
        vysledek = 4 * M_PI * pow(r, 2);
        printf("Vysledek obsahu = %f", vysledek);
    }
    else {
        printf("Spatne pismeno!");
    }

    return 0;
}
 
Odpovědět
20.11.2014 14:38
Avatar
MrPabloz
Člen
Avatar
Odpovídá na informatik87
MrPabloz:20.11.2014 14:52

Protože scanf načte první znak co tam je, a protože jsi zadal předtím číslo, a odentroval, tak se načetlo číslo, a enter tam zůstal, a ten pak ten druhy scanf načte :) tedy nečeká až něco zadáš ty:)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.11.2014 14:52
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
informatik87
Člen
Avatar
Odpovídá na MrPabloz
informatik87:20.11.2014 14:56

Právě jsem na to přišel, musí tam bát místo scanf("%c" ... scanf("%s" ..., že ano?

 
Nahoru Odpovědět
20.11.2014 14:56
Avatar
MrPabloz
Člen
Avatar
Odpovídá na informatik87
MrPabloz:21.11.2014 12:26

Ne, zprávně bys měl vyčistit buffer předtím, než načteš znak, tedy něco ve stylu fflush(stdin); není to sice nejkorektnější, ale ano, udělá to to, co ty chceš, tedy načíst znak, co on zadá, tím že tam dáš string, tak se ti načtou i to před tím, tedy nebude to pořád to v, ale teda pokud se nemýlím. Tím fflush se to řeší asi nejrychleji, ti to vyčistí stdin buffer a pak načte znak co zadáš teprv :)

Nahoru Odpovědět
21.11.2014 12:26
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Odpovídá na MrPabloz
Tomáš Maňhal:21.11.2014 12:28

"správně"

 
Nahoru Odpovědět
21.11.2014 12:28
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na informatik87
David Hartinger:21.11.2014 13:02

Mám dojem, že by mohlo zafungovat když tam zadáš " %c" (s mezerou).

Nahoru Odpovědět
21.11.2014 13:02
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Libor Šimo (libcosenior):21.11.2014 14:41

Ja som vždy používal odstránenie znaku ENTER:

scanf("%f", &r);
while (getchar() != '\n') ; // odstranenie enter
printf("Pro vypocitani objemu zadej v a obsahu s: ");
scanf("%c", &vyber);

ale Davidov spôsob sa mi zadá jednoduchší a pokiaľ to nemá nejaké vedľajšie účinky, bude asi najlepší zo všetkých tu uvedených. ;)

Nahoru Odpovědět
21.11.2014 14:41
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):21.11.2014 14:53

Môže niekto skúsenejší vybrať, ktoré s tých troch možností je najsprávnejšia?

scanf("%f", &r);
//while (getchar() != '\n') ; // odstranenie enter
//fflush(stdin); // vyprázdnenie buferu
printf("Pro vypocitani objemu zadej v a obsahu s: ");
scanf(" %c", &vyber); // medzera pred %c
Nahoru Odpovědět
21.11.2014 14:53
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.