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

Muci me baferovani ulaz, jos malo, pa cu pocnem da ga sanjam...

[es] :: C/C++ programiranje :: Muci me baferovani ulaz, jos malo, pa cu pocnem da ga sanjam...

[ Pregleda: 2041 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stalker
Branko Kokanovic
Beograd

Član broj: 11897
Poruke: 606
*.drenik.net



+2 Profil

icon Muci me baferovani ulaz, jos malo, pa cu pocnem da ga sanjam...17.08.2004. u 12:13 - pre 239 meseci
Da ne davim mnogo, juce sam se dugo mucio i nisam dosao do resenja, pa ako neko moze da mi pomogne. Posto cu najbolje razumeti iz primera, dopunite sledeci program:

Code:

#include <stdio.h>

main(){
    char *a[100], odgovor_korisnika;
    int i=0;
    do{
        printf("Unesite tekst:");
        a=calloc(200,sizeof(char));
        **** /*upisemo tekst u a[i++]*/
        printf("Zelite li jos?(d/n));
        **** /upisemo odgovor u odgovor_korisnika*/
    } while ((odgovor=='D') || (odgovor=='d'));
}


Nije bitno sad ako je lose napisan, na brzinu sam pisao. Poenta je da a(i) ima tekst koji korisnik unese i da odgovor_korisnika ima prvi char (a moze neko da ukuca i 'da'). Probao sam sa scanf, getchar, gets kao i sa while petljama koje ciste '\n' iz bafera, ali nista nisam uspeo.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Muci me baferovani ulaz, jos malo, pa cu pocnem da ga sanjam...17.08.2004. u 12:44 - pre 239 meseci
Code:
#include stdio.h
 
 main(){
     char *a[100], odgovor_korisnika;
     int i=0;
     do{
         printf("Unesite tekst:");
     fflush(stdout);
         a[i]= (char*) calloc(200,sizeof(char));
     scanf("%[^\n]", a[i++]);
     while( getchar() != '\n');
     printf("Zelite li jos?(d/n)");
     fflush(stdout);
     scanf("%c", odgovor_korisnika);
     while( getchar() != '\n');
     } while ((odgovor_korisnika=='D') || (odgovor_korisnika=='d'));
 }
 

Da objasnim: fflush ti treba da bi forsirao ispis teksta. stdout je linijski baferisan i bez "n" na kraju reda ne postoji garancija da će tekst biti ispisan.

I stdin je linijski baferisan. To znači da ako nešto ukucavaš u njega, program neće nastaviti dok ne pritisneš "n". Međutim, stdin i stdout nisu uopšte u sinhronizmu, tako da ako hoćemo da program ide „redom“, taj red moramo da forsiramo.

Pošto format %s čita stdin do poslednjeg ne-belog znaka, posle čitanja stringa ostalo nam je jedno "n" u baferu. Njega pokupimo drugim scanfom, a zatim pokupimo i odgovor_korisnika. Pošto smo to pročitali, u stdin-u postoji još niz ne-belih znakova plus jedan "\n" koji mora da postoji zato što je ulaz linijski baferovan. To ne možemo da pokupimo novim scanfom, pošto bi to tražilo od korisnika pritisak na još jedan carriage return kako bismo prošli kroz scanf. Takođe, za stdin nam nije na raspolaganju fflush. Zato moramo da ručno izvadimo ostale znake iz bafera, prestajući sa "n" koje mora da postoji na kraju korisnikovog ulaza. Na taj način nam stdin ponovo bude čist pri ulasku u sledeću petlju.

I nemoj zaboraviti da proveravaš koje vrednosti vraća scanf, kako bi znao da li je konverzija prošla kako treba.

f

[edit: malopre primetih da gore piše unesi tekst a ne unesi reč; zato sam promenio prvi format da umesto %s bude %[^\n]. Ovo poslednje znači: učitaj sve znake do prvog \n.]
 
Odgovor na temu

stalker
Branko Kokanovic
Beograd

Član broj: 11897
Poruke: 606
*.drenik.net



+2 Profil

icon Re: Muci me baferovani ulaz, jos malo, pa cu pocnem da ga sanjam...18.08.2004. u 00:51 - pre 239 meseci
E, to mi je trebalo. Hvala, care
 
Odgovor na temu

[es] :: C/C++ programiranje :: Muci me baferovani ulaz, jos malo, pa cu pocnem da ga sanjam...

[ Pregleda: 2041 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

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