Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zašto neće gets posle scanf?

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zašto neće gets posle scanf?

[ Pregleda: 3093 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Aleksandar Ilić
Software Developer
Beograd

Član broj: 15867
Poruke: 417

Sajt: www.ailic.rs


+3 Profil

icon Zašto neće gets posle scanf?30.01.2009. u 03:38 - pre 184 meseci
Gets() funkcija ne radi ukoliko je pre nje pozvana scanf(), zašto?
Sledeći kod ne radi kako treba. Međutim, ukoliko stavim gets() da bude ispred scanf-ova, onda radi.
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int prvi, drugi;
  char string[64];
  
  scanf("%d", &prvi);
  scanf("%d", &drugi);
  gets(string);
  
  printf("Prvi: %d\n", prvi);
  printf("Drugi: %d\n", drugi);
  printf("String: %s\n", string);
  
  system("PAUSE");  
}

Stavljanje gets-a na početku mi neće rešiti problem, jer u kodu na kojem radim učitavanje prolazi kroz while petlju više puta, tako da gets() kad tad naiđe posle scanf-a.


Poz.
„Naposletku, suština saznavanja nije u tome gubimo li igru, već kako je gubimo,
šta time spoznajemo, čemu nas je poraz naučio i kako nas to menja. Gubiti na određen
način znači - dobijati.”

Richard Bach
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Zašto neće gets posle scanf?30.01.2009. u 06:28 - pre 184 meseci
Pokusaj da dodas liniju fflush( stdin ); izmedju scanf() i gets().
 
Odgovor na temu

Aleksandar Ilić
Software Developer
Beograd

Član broj: 15867
Poruke: 417

Sajt: www.ailic.rs


+3 Profil

icon Re: Zašto neće gets posle scanf?30.01.2009. u 13:22 - pre 184 meseci
Radi. Hvala puno.

A zbog čega se javlja ovaj problem?
„Naposletku, suština saznavanja nije u tome gubimo li igru, već kako je gubimo,
šta time spoznajemo, čemu nas je poraz naučio i kako nas to menja. Gubiti na određen
način znači - dobijati.”

Richard Bach
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
87.116.180.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Zašto neće gets posle scanf?30.01.2009. u 13:42 - pre 184 meseci
fflush() je "nuzno zlo", koje cisti ulazni stream od zaostalih kontrolnih kodova, tipa CR, LF i sl, koji su tu od nekog prethodnog ulaza, sto moze da ima nezeljene efekte, video si. Ovu funkciju bi u praksi trebalo izbegavati zbog neportabilnosti i nepredvidivog ponasanja u pojedinim slucajevma. Na netu ces naci vise o tome, kao i neka programska resenja za 'portabilno' ciscenje ulaznog buffera.

Ponekad ces videti i izraze tipa: scanf(" %c", &c ), sa BLANKOm ispred %c, sto je opet neki nacin za sprecavanje onoga sto se tebi dogodilo.

Ipak, za potrebe resavanja skolskih primera, gde je poenta resiti zadatak i dobiti ocenu u indeksu, a ne proucavati detalje implementacije C ulaza i izlaza - fflush je idealan.
 
Odgovor na temu

Aleksandar Ilić
Software Developer
Beograd

Član broj: 15867
Poruke: 417

Sajt: www.ailic.rs


+3 Profil

icon Re: Zašto neće gets posle scanf?30.01.2009. u 13:47 - pre 184 meseci
Aha, skapirao sam. Hvala na objašnjenju.

Poz.
„Naposletku, suština saznavanja nije u tome gubimo li igru, već kako je gubimo,
šta time spoznajemo, čemu nas je poraz naučio i kako nas to menja. Gubiti na određen
način znači - dobijati.”

Richard Bach
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Zašto neće gets posle scanf?01.02.2009. u 23:43 - pre 184 meseci
scanf procita ono sto si ukucao prije nego si lupio "ENTER". I pritisak na enter "udje" u ulazni stream i ostane neprocitan (njegova oznaka je '\n').
Kad prilikom sledeceg citanja citas sa gets on procita upravo taj enter, a gets cita jednu liniju, a posto se krajem linije smatra '\n', tj. enter, on smatra da je procitao praznu liniju jer je odmah naletio na '\n' tj. na enter i ti dobijes da je u stvari procitan prazan string.
Znaci, problem pravi onaj enter koji si lupio kad si prethodno unosio broj koji si citao sa scanf.

Sledecom naredbom mozes iscitati sve znakove koji su ostali neprocitani prije entera (sto se moze desiti iz raznih razloga) ukljucujuci i sam enter:

while(getchar() != '\n');

Poslije ovoga bi trebalo da radi.

 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zašto neće gets posle scanf?

[ Pregleda: 3093 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.