Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Ongo Forumaš(ica)
Pridružen/a: 13. 02. 2006. (14:37:33) Postovi: (23)16
|
Postano: 17:55 sri, 10. 5. 2006 Naslov: Opako pitanje |
|
|
Hmm... Nisam siguran da bih to ovdje trebao pitati... Stovise nisam uopce siguran bih li to trebao pitati, ali to me nitko nije naucio ni na predavanjima ni na vjezbama, a cini mi se da ni nece, pa cu ipak pitati.
So... Recimo da hocu ucitati broj. E sad, ja hocu biti extra pedantan (a ne samo my usual pedantan), pa hocu da se korisnik informira ukoliko unese nesto sto nije broj. Stovise jos hocu da mu se pruzi druga prilika u tom nesretnom slucaju. Ideja (za sada losa):
[code:1]int i;
while(!scanf("%d",&i))
printf("Treba unijeti broj!");
[/code:1]
Problem je u tome sto se scanf, kad jedamput ne uspije ucitati unos, tj. kad jedamput vrati 0, 'ugasi' tj. nakon toga vise ni ne pokusava ista ucitati, uopce se ne izvrsava, nego samo vraca 0.
Pitanja:
Zasto nastaje taj problem? (ima li veze s strerr?)
Kako ga izbjeci? (kako resetirati strerr, ukoliko sam na pravom putu?)
Hmm... Nisam siguran da bih to ovdje trebao pitati... Stovise nisam uopce siguran bih li to trebao pitati, ali to me nitko nije naucio ni na predavanjima ni na vjezbama, a cini mi se da ni nece, pa cu ipak pitati.
So... Recimo da hocu ucitati broj. E sad, ja hocu biti extra pedantan (a ne samo my usual pedantan), pa hocu da se korisnik informira ukoliko unese nesto sto nije broj. Stovise jos hocu da mu se pruzi druga prilika u tom nesretnom slucaju. Ideja (za sada losa):
Kod: | int i;
while(!scanf("%d",&i))
printf("Treba unijeti broj!");
|
Problem je u tome sto se scanf, kad jedamput ne uspije ucitati unos, tj. kad jedamput vrati 0, 'ugasi' tj. nakon toga vise ni ne pokusava ista ucitati, uopce se ne izvrsava, nego samo vraca 0.
Pitanja:
Zasto nastaje taj problem? (ima li veze s strerr?)
Kako ga izbjeci? (kako resetirati strerr, ukoliko sam na pravom putu?)
|
|
[Vrh] |
|
pbanicev Forumaš(ica)
Pridružen/a: 23. 10. 2004. (19:32:44) Postovi: (52)16
Spol:
Lokacija: /dev/random V /dev/null V /dev/zero
|
Postano: 18:34 sri, 10. 5. 2006 Naslov: |
|
|
$ man scanf
***
RETURN VALUES
If the input ends before the first conflict or conversion, EOF is
returned. Otherwise, these functions return the number of
successfully assigned input items. This number is a short count, or
even zero if a conflict ensues between an input character and the
control string.
***
tj, treba se uzeti neku drugu funkciju :wink: , a ako takve nema, treba napisati novu.
HINT: neka funkcija uzima char po char iz inputa i onda provjerava njen ascii kod
$ man scanf
***
RETURN VALUES
If the input ends before the first conflict or conversion, EOF is
returned. Otherwise, these functions return the number of
successfully assigned input items. This number is a short count, or
even zero if a conflict ensues between an input character and the
control string.
***
tj, treba se uzeti neku drugu funkciju , a ako takve nema, treba napisati novu.
HINT: neka funkcija uzima char po char iz inputa i onda provjerava njen ascii kod
|
|
[Vrh] |
|
Zvone Forumaš(ica)
Pridružen/a: 01. 07. 2003. (13:09:44) Postovi: (9D)16
|
Postano: 9:01 čet, 11. 5. 2006 Naslov: |
|
|
Pitanje je sasvim na mjestu :)
Problem je u slijedecem: nakon sto se liniji [tt]scanf ("%d", &i);[/tt] unese nesto sto nije broj, to nesto ostane u [i]input bufferu[/i]. Kada se ponovno pozove [tt]scanf ("%d", &i);[/tt] ili bilo koja druga funkcija za citanje ulaza, ona nece traziti novi ulaz od korisnika ako vec nesto ima u [i]input bufferu[/i] vec ce prvo citati iz njega.
Sada je jasno zbog cega se Ongov kod vrti u beskonacnoj petlji.
Da se to popravi treba nakon neuspjesnog citanja int-a pocistiti buffer, tako da npr. procitamo sve znakove do kraja retka:
[code:1]int i;
while (!scanf("%d", &i))
{
printf ("Treba unijeti broj!");
scanf ("%*[^\n]");
}[/code:1]
Umjesto [tt]scanf ("%*[^\n]");[/tt] moze i [tt]fgets[/tt] ili petlja u kojoj [tt]getchar[/tt] cita sve do kraja retka.
[tt]fflush(stdin)[/tt] ne radi.
Pitanje je sasvim na mjestu
Problem je u slijedecem: nakon sto se liniji scanf ("%d", &i); unese nesto sto nije broj, to nesto ostane u input bufferu. Kada se ponovno pozove scanf ("%d", &i); ili bilo koja druga funkcija za citanje ulaza, ona nece traziti novi ulaz od korisnika ako vec nesto ima u input bufferu vec ce prvo citati iz njega.
Sada je jasno zbog cega se Ongov kod vrti u beskonacnoj petlji.
Da se to popravi treba nakon neuspjesnog citanja int-a pocistiti buffer, tako da npr. procitamo sve znakove do kraja retka:
Kod: | int i;
while (!scanf("%d", &i))
{
printf ("Treba unijeti broj!");
scanf ("%*[^\n]");
} |
Umjesto scanf ("%*[^\n]"); moze i fgets ili petlja u kojoj getchar cita sve do kraja retka.
fflush(stdin) ne radi.
|
|
[Vrh] |
|
Ongo Forumaš(ica)
Pridružen/a: 13. 02. 2006. (14:37:33) Postovi: (23)16
|
|
[Vrh] |
|
pbanicev Forumaš(ica)
Pridružen/a: 23. 10. 2004. (19:32:44) Postovi: (52)16
Spol:
Lokacija: /dev/random V /dev/null V /dev/zero
|
|
[Vrh] |
|
|