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

scanf - problem sa citanjem sa standardnog ulaza

[es] :: C/C++ programiranje :: scanf - problem sa citanjem sa standardnog ulaza

[ Pregleda: 2504 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
93.86.66.*



+1 Profil

icon scanf - problem sa citanjem sa standardnog ulaza02.06.2009. u 23:23 - pre 181 meseci
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?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza03.06.2009. u 06:15 - pre 181 meseci
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 );
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.adsl.eunet.rs.



+67 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza03.06.2009. u 06:52 - pre 181 meseci
gets() nikako !!! nismo u 90im :)

fgets() ok
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza03.06.2009. u 07:11 - pre 181 meseci
^
Ok, slazem se... onda evo i kratak reference sa primerom za fgets
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
93.86.142.*



+1 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza03.06.2009. u 21:01 - pre 181 meseci
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. :(
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.adsl.eunet.rs.



+67 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza04.06.2009. u 20:38 - pre 181 meseci
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]
 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
79.101.222.*



+1 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza04.06.2009. u 21:41 - pre 181 meseci
Proradilo je ovo sa regex izrazom. Prvi put vidim ovu foru. :)) Svaka cast!
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.adsl.eunet.rs.



+67 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza04.06.2009. u 23:07 - pre 181 meseci
ipak preporucujem da koristis fgets()

scanf nije namenjen za ovakvo koriscenje i ovo je cist C-ovski (ruzan) hack :)
 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
79.101.134.*



+1 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza05.06.2009. u 08:47 - pre 181 meseci
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.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza05.06.2009. u 09:13 - pre 181 meseci
http://www.elitesecurity.org/t353056
 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
79.101.134.*



+1 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza05.06.2009. u 09:48 - pre 181 meseci
Hvala za link. Sad su neke stvari jasnije :)
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.ns.ac.yu.



+67 Profil

icon Re: scanf - problem sa citanjem sa standardnog ulaza05.06.2009. u 12:03 - pre 181 meseci
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....
 
Odgovor na temu

[es] :: C/C++ programiranje :: scanf - problem sa citanjem sa standardnog ulaza

[ Pregleda: 2504 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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