ongelmia fgetsin kanssa

hei,

voisiko joku valaista miksi fgets joskus hyppaa suoraan eteenpain ohjelmassa odottamatta kayttajan syotetta.

tassa koodin patkaa

   if (current_node->yes_ptr!= NULL && current_node->no_ptr!=NULL)
   printf("question: %s\n", current_node->data);    
   fgets(answer, sizeof(answer), stdin);
   
   if(strcmp(answer, yes)!=0)

current_node= current_node->no_ptr;

else
current_node= current_node->yes_ptr;

}
   
if (current_node->yes_ptr== NULL && current_node->no_ptr==NULL)
printf("are you thinkin of: %s\n", current_node->data);

fgets(answer, sizeof(answer), stdin);
   
if(strcmp(answer, yes)==0)

printf("gosh! I won");

printf("want to play again?");

fgets(answer, sizeof(answer), stdin);
if(strcmp(answer, yes)==0)
continue;

else
exit(0);


}



(pahoittelen etta postittamani koodi on pitka hankalaa havainnollistaa ongelmaa lyhemmin.)


nyt jos pelaan pelia kone tulostaa mm seuraavaa
uestion: does it live in the sea?
no
question: does it bark
yes
are you thinkin of: dog
want to play again?
wunschpx-lab2->

eli kohdissa are you thinking of ja want to play again fgets ei kysy kayttajalta syotetta. Miksi? Ohjelma kysyy kaiken jos vastaa kaikkeen no mutta uudelleen pelatessa se tulostaa kaksi kysymysta putkeen kysymatta vastausta ekaan.

eiko fgets pitaisi toimia juuri noin!

mista kiikastaa!

pahoittelen etta postittamani koodi on pitka hankalaa havainnollistaa ongelmaa lyhemmin.

kiitos kaikille avusta etukateen
3457
Äänestä

Muut lukivat myös

Vastaukset 3

Vanhimmat

Käytä fflush-funktiota (tutki helpistä) ennen fgetsiä, koska nuo I/O:t ovat puskuroivia palveluja.

Äänestä
  • Toinen vaihtoehto on asettaa stdio stdout puskuroimattomiks.
    esim. unix/linux koneissa
    $man setbuf

    void setbuf(FILE *stream, char *buf);

    elikkä, setbuf(stind, NULL);

    Yks keino on että, noissa kutsuissa enne fgetsiä, heität sen '\n'
    merkin printf:stä veke.

    Äänestä

  • Kods kirjoitti:

    Toinen vaihtoehto on asettaa stdio stdout puskuroimattomiks.
    esim. unix/linux koneissa
    $man setbuf

    void setbuf(FILE *stream, char *buf);

    elikkä, setbuf(stind, NULL);

    Yks keino on että, noissa kutsuissa enne fgetsiä, heität sen '\n'
    merkin printf:stä veke.

    joo kirotusviheet,
    stdin, stdout,

    setbuf(stdin, NULL);
    setbuf(stdout, NULL);

    Äänestä

Kommentoi aloitusta


Pewu kirjoitti:

hei,

voisiko joku valaista miksi fgets joskus hyppaa suoraan eteenpain ohjelmassa odottamatta kayttajan syotetta.

tassa koodin patkaa

   if (current_node->yes_ptr!= NULL && current_node->no_ptr!=NULL)
   printf("question: %s\n", current_node->data);    
   fgets(answer, sizeof(answer), stdin);
   
   if(strcmp(answer, yes)!=0)

current_node= current_node->no_ptr;

else
current_node= current_node->yes_ptr;

}
   
if (current_node->yes_ptr== NULL && current_node->no_ptr==NULL)
printf("are you thinkin of: %s\n", current_node->data);

fgets(answer, sizeof(answer), stdin);
   
if(strcmp(answer, yes)==0)

printf("gosh! I won");

printf("want to play again?");

fgets(answer, sizeof(answer), stdin);
if(strcmp(answer, yes)==0)
continue;

else
exit(0);


}



(pahoittelen etta postittamani koodi on pitka hankalaa havainnollistaa ongelmaa lyhemmin.)


nyt jos pelaan pelia kone tulostaa mm seuraavaa
uestion: does it live in the sea?
no
question: does it bark
yes
are you thinkin of: dog
want to play again?
wunschpx-lab2->

eli kohdissa are you thinking of ja want to play again fgets ei kysy kayttajalta syotetta. Miksi? Ohjelma kysyy kaiken jos vastaa kaikkeen no mutta uudelleen pelatessa se tulostaa kaksi kysymysta putkeen kysymatta vastausta ekaan.

eiko fgets pitaisi toimia juuri noin!

mista kiikastaa!

pahoittelen etta postittamani koodi on pitka hankalaa havainnollistaa ongelmaa lyhemmin.

kiitos kaikille avusta etukateen

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu