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.]