[ marko_81 @ 02.06.2009. 23:23 ] @
Imam problem sa funkcijom scanf. Treba da procitam string koji unesem preko tastature.
Citam kroz for petlju i unosim u niz struktura koji sam prethodno definisao. Polje strukture u koje unosim je tipa: char ime[DIM]; Evo koda kojim citam podatak za i-ti prolaz:
Code:
scanf("%s", struktura[i].ime);

Ukoliko unesem string koji ima samo jednu rec, sve odradi kako treba ali ako unesem string od npr dve reci, onda procita samo prvu rec a druga rec se izgubi negde. Citao sam negde da scanf ima neke probleme prilikom citanja podataka ali ne znam kako da resim ovaj problem?
[ X Files @ 03.06.2009. 06:15 ] @
Umesto scanf koristi za stringove gets:
Code:

gets( struktura[i].ime );

Ima jos notacija koja ce dozvoliti unos i blanko znaka:

Code:

// sa eksplicitnim ogranicenjem max broja karaktera koji ce biti uzeti u obzir
fgets( struktura[i].ime, 80, stdin );


Code:

// ... pa cak i sa scanf, valjda :)
scanf( "%80c", struktura[i].ime );
[ EArthquake @ 03.06.2009. 06:52 ] @
gets() nikako !!! nismo u 90im :)

fgets() ok
[ X Files @ 03.06.2009. 07:11 ] @
^
Ok, slazem se... onda evo i kratak reference sa primerom za fgets
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

[ marko_81 @ 03.06.2009. 21:01 ] @
Probao sam sa fgets i desava mi se vrlo cudan problem. Evo koda kojim unosim polja strukture:
Code:

printf("Unesi podatke o gradovima:\n");
for (i = 0; i < n; i++) {
    printf("Ime grada: ");
    fgets(grad[i].ime, 80, stdin); // scanf("%s", grad[i].ime);
    printf("Broj stanovnika: ");
    scanf("%d", &grad[i].br_stan);
    printf("\n");
}

Cim odstampa "Ime grada: ", umesto da saceka da unesem ime, odmah me prebaci na sledeci red i stampa "Broj stanovnika: ".
Nije mi jasno zasto se ovo desava? Ukoliko kupim pomocu scanf, lepo radi za imena od jedne reci.
Probao sam i sa funkcijom fscanf i opet se isto desava. :(
[ EArthquake @ 04.06.2009. 20:38 ] @
dodaj jedan scanf(" "); ispred fgets ...

uzasno , znam ... :)

ili mozes da koristis nesto ovakvo
Code:

    scanf(" %20[^\n]", buff);


primeti space nakon prvog "


20 znaci da iscita maksimalno 20 znakova , bez toga imas potencijalni buffer overflow
[^\n] mu dodje regex koji kaze da stane kad vidi CRLF , odnosno new line , \n


inace, problem nastaja zbog nacina na koji radi stdin/stdout
imas repove koji se posle citaju ...

zato ti i treba onaj space ispred %20...


[Ovu poruku je menjao EArthquake dana 04.06.2009. u 21:59 GMT+1]
[ marko_81 @ 04.06.2009. 21:41 ] @
Proradilo je ovo sa regex izrazom. Prvi put vidim ovu foru. :)) Svaka cast!
[ EArthquake @ 04.06.2009. 23:07 ] @
ipak preporucujem da koristis fgets()

scanf nije namenjen za ovakvo koriscenje i ovo je cist C-ovski (ruzan) hack :)
[ marko_81 @ 05.06.2009. 08:47 ] @
Nemam nista protiv fgets() ali je preskoci kad je pozovem i predje na sledecu naredbu. Trebalo bi valjda da saceka da napravim unos. Nije mi jasno sto se tako ponasa.
[ X Files @ 05.06.2009. 09:13 ] @
http://www.elitesecurity.org/t353056
[ marko_81 @ 05.06.2009. 09:48 ] @
Hvala za link. Sad su neke stvari jasnije :)
[ EArthquake @ 05.06.2009. 12:03 ] @
samo da istaknem, te "repove" ces imati ne samo zbog new line karaktera
vec i ako sa scanf() ili fgets()ogranicis koliko karaktera da ucita, a bude uneseno vise pre entera

taj ostatak ce ostati u baferu, pa ce ga sledece citanje pokupiti,ako se ne fflush()uje iz bafera....

kao sto rece neko , fflush jje jako nezgodan, ali se ponekad ne moze izbeci....