[ stalker @ 17.08.2004. 12:13 ] @
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.
[ filmil @ 17.08.2004. 12:44 ] @
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.]
[ stalker @ 18.08.2004. 00:51 ] @
E, to mi je trebalo. Hvala, care