[ Aleksandar Ilić @ 30.01.2009. 03:38 ] @
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.
[ X Files @ 30.01.2009. 06:28 ] @
Pokusaj da dodas liniju fflush( stdin ); izmedju scanf() i gets().
[ Aleksandar Ilić @ 30.01.2009. 13:22 ] @
Radi. Hvala puno.

A zbog čega se javlja ovaj problem?
[ X Files @ 30.01.2009. 13:42 ] @
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.
[ Aleksandar Ilić @ 30.01.2009. 13:47 ] @
Aha, skapirao sam. Hvala na objašnjenju.

Poz.
[ Odin D. @ 01.02.2009. 23:43 ] @
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.