Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Tygy Forumaš(ica)


Pridružen/a: 22. 11. 2008. (15:27:08) Postovi: (102)16
|
|
[Vrh] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 14:00 ned, 7. 6. 2009 Naslov: Re: pomoć |
|
|
[quote="Tygy"]
if (strcasecmp(niz(i),niz(j))>0) onda ti obavi zamjenu.[/quote]
strcasecmp radi uspoređivanje uopravo onako kako bi i "na ruke"... dakle ide po slovima, i uspoređuje prvo slova sa prvim, pa ako su isti,drugo s drugim itd. Ovo case kaže caseINsensitive, dakle ista su mu velika i mala slova.
Primjer:
ABCD
ABDR
ide po redu:
A=A
B=B
C<D vrati -1 (ili nešto negativno, ne znam točno što)
Tygy (napisa): |
if (strcasecmp(niz(i),niz(j))>0) onda ti obavi zamjenu. |
strcasecmp radi uspoređivanje uopravo onako kako bi i "na ruke"... dakle ide po slovima, i uspoređuje prvo slova sa prvim, pa ako su isti,drugo s drugim itd. Ovo case kaže caseINsensitive, dakle ista su mu velika i mala slova.
Primjer:
ABCD
ABDR
ide po redu:
A=A
B=B
C<D vrati -1 (ili nešto negativno, ne znam točno što)
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy 
|
|
[Vrh] |
|
Tygy Forumaš(ica)


Pridružen/a: 22. 11. 2008. (15:27:08) Postovi: (102)16
|
Postano: 11:10 uto, 9. 6. 2009 Naslov: |
|
|
puno hvala.
nadalje, imam još poneko pitanje:
imam definiranu strukturu:
typedef struct _razlomak{
int x,y;
struct _razlomak *next;
}razlomak;
1. first je inicijaliziran ovako:
razlomak *first=NULL;
a pitanje je:
je li if ( ! first ) isto kao if (fist!=0) ili if (first!=NULL) i zasto?
2. kad pisem "new" (jer zelim novi, ako je first prvi, tj next sljedeci) zasto mi ga c pobolda, tj, program ne radi nego moram napisati bilo sto drugo samo ne novi (tad program radi)
3.kad pretipkam zadatak 7.1 iz skripte, ne radi zbog dijela brisanja liste...jel nesto nevalja u skripti? :lol:
4. zasto je uz ime funkcije (u tim veznim listama) znakic *....?
-kako to funkcionira?
puno hvala.
nadalje, imam još poneko pitanje:
imam definiranu strukturu:
typedef struct _razlomak{
int x,y;
struct _razlomak *next;
}razlomak;
1. first je inicijaliziran ovako:
razlomak *first=NULL;
a pitanje je:
je li if ( ! first ) isto kao if (fist!=0) ili if (first!=NULL) i zasto?
2. kad pisem "new" (jer zelim novi, ako je first prvi, tj next sljedeci) zasto mi ga c pobolda, tj, program ne radi nego moram napisati bilo sto drugo samo ne novi (tad program radi)
3.kad pretipkam zadatak 7.1 iz skripte, ne radi zbog dijela brisanja liste...jel nesto nevalja u skripti?
4. zasto je uz ime funkcije (u tim veznim listama) znakic *....?
-kako to funkcionira?
|
|
[Vrh] |
|
kenny Petica iz zalaganja


Pridružen/a: 28. 03. 2003. (09:18:36) Postovi: (3B7)16
Spol: 
Lokacija: ...somewhere over the rainbow...
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
Postano: 13:33 uto, 9. 6. 2009 Naslov: |
|
|
[quote="Tygy"]1. first je inicijaliziran ovako:
razlomak *first=NULL;
a pitanje je:
je li if ( ! first ) isto kao if (fist!=0) ili if (first!=NULL) i zasto?[/quote]
Kako kenny rece, do na ono "jednako" u [tt]if()[/tt]-u (ide dvostruka jednakost jer je to provjera uvjeta). 8)
Sto se [tt]NULL[/tt]-a tice, on je ovako nesto:
[tt]#define NULL ((void *)0)[/tt],
dakle nula castana na pointer. 8)
[quote="Tygy"]2. kad pisem "new" (jer zelim novi, ako je first prvi, tj next sljedeci) zasto mi ga c pobolda, tj, program ne radi nego moram napisati bilo sto drugo samo ne novi (tad program radi)[/quote]
Zato jer snimas s extenzijom [tt].cpp[/tt] (za sto smo puno puta rekli da ce vam uzrokovati probleme u drugom semstru, ne samo s listama), pa se poziva C++ compiler, a u C++-u [tt]new[/tt] stvarno ima pametno znacenje. 8)
[quote="Tygy"]3.kad pretipkam zadatak 7.1 iz skripte, ne radi zbog dijela brisanja liste...jel nesto nevalja u skripti? :lol:[/quote]
Moguce, no cini mi se da sam to testirao kad sam pisao. :neznam: Provjeri je l' tocno prepisano, reci sto ti javlja, copy-paste-aj svoj kod ovdje,... :)
[quote="Tygy"]4. zasto je uz ime funkcije (u tim veznim listama) znakic *....?
-kako to funkcionira?[/quote]
Krivo gledas; zvjezdica je vezana uz tip, a ne uz (direktno) ime funkcije. :? Pazi:
[tt]nesto *f(...)[/tt]
znaci da funkcija vraca vrijednost tipa [tt]nesto*[/tt], isto kao sto
[tt]int *x;[/tt]
znaci da je [tt]x[/tt] varijabla tipa "pointer na [tt]int[/tt]". 8)
Tygy (napisa): | 1. first je inicijaliziran ovako:
razlomak *first=NULL;
a pitanje je:
je li if ( ! first ) isto kao if (fist!=0) ili if (first!=NULL) i zasto? |
Kako kenny rece, do na ono "jednako" u if()-u (ide dvostruka jednakost jer je to provjera uvjeta).
Sto se NULL-a tice, on je ovako nesto:
#define NULL ((void *)0),
dakle nula castana na pointer.
Tygy (napisa): | 2. kad pisem "new" (jer zelim novi, ako je first prvi, tj next sljedeci) zasto mi ga c pobolda, tj, program ne radi nego moram napisati bilo sto drugo samo ne novi (tad program radi) |
Zato jer snimas s extenzijom .cpp (za sto smo puno puta rekli da ce vam uzrokovati probleme u drugom semstru, ne samo s listama), pa se poziva C++ compiler, a u C++-u new stvarno ima pametno znacenje.
Tygy (napisa): | 3.kad pretipkam zadatak 7.1 iz skripte, ne radi zbog dijela brisanja liste...jel nesto nevalja u skripti?  |
Moguce, no cini mi se da sam to testirao kad sam pisao. Provjeri je l' tocno prepisano, reci sto ti javlja, copy-paste-aj svoj kod ovdje,...
Tygy (napisa): | 4. zasto je uz ime funkcije (u tim veznim listama) znakic *....?
-kako to funkcionira? |
Krivo gledas; zvjezdica je vezana uz tip, a ne uz (direktno) ime funkcije. Pazi:
nesto *f(...)
znaci da funkcija vraca vrijednost tipa nesto*, isto kao sto
int *x;
znaci da je x varijabla tipa "pointer na int".
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
Milojko Forumaš(ica)


Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol: 
Lokacija: Hilbertov hotel
|
Postano: 14:45 uto, 9. 6. 2009 Naslov: |
|
|
[code:1]#include <stdio.h>
void svrljo (char s[], char c1, char c2) {
int i, k = 0, j = 0;
for (i = 0; s[i] != '\0'; ++i) {
if (s[i] == c2) ++j;
}
for (; i >= 0; i--) {
s[i+j] = s[i];
if (s[i] == c2) {
s[i+(--j)] = s[i];
}
}
for (i = 0; s[i] != '\0'; ++i) {
if (s[i] != c1) s[k++] = s[i];
}
s[k] = '\0';
}
int main() {
char s[77], c1, c2;
printf("Unesi string:\n");
scanf("%[^\n]", s);
printf("c1 i c2: ");
scanf("%c %c", &c1, &c2);
svrljo(s, c1, c2);
printf("rez: %s\n", s);
scanf("%%");
return 0;
} [/code:1]
neda mi da učitam oba chara, tj, npr, kod stringa "salmonela" i unosa samo slova "l", on podupla oba "l", a pri unosu dva chara, nakon što lupim [tt]enter[/tt], samo me izbaci.
Kod: | #include <stdio.h>
void svrljo (char s[], char c1, char c2) {
int i, k = 0, j = 0;
for (i = 0; s[i] != '\0'; ++i) {
if (s[i] == c2) ++j;
}
for (; i >= 0; i--) {
s[i+j] = s[i];
if (s[i] == c2) {
s[i+(--j)] = s[i];
}
}
for (i = 0; s[i] != '\0'; ++i) {
if (s[i] != c1) s[k++] = s[i];
}
s[k] = '\0';
}
int main() {
char s[77], c1, c2;
printf("Unesi string:\n");
scanf("%[^\n]", s);
printf("c1 i c2: ");
scanf("%c %c", &c1, &c2);
svrljo(s, c1, c2);
printf("rez: %s\n", s);
scanf("%%");
return 0;
} |
neda mi da učitam oba chara, tj, npr, kod stringa "salmonela" i unosa samo slova "l", on podupla oba "l", a pri unosu dva chara, nakon što lupim enter, samo me izbaci.
_________________ Sedam je prost broj
Bolonja je smeće i to pod hitno treba mijenjat
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
Postano: 15:10 uto, 9. 6. 2009 Naslov: |
|
|
Da, da, da,... klasika, vec puno puta recena i ovdje i na vjezbama, konzultacijama,... stavi razmak ispred [b]oba[/b] [tt]%c[/tt]. 8)
Da, da, da,... klasika, vec puno puta recena i ovdje i na vjezbama, konzultacijama,... stavi razmak ispred oba %c.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
Milojko Forumaš(ica)


Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol: 
Lokacija: Hilbertov hotel
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
Bubba Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12) Postovi: (53)16
Spol: 
|
Postano: 15:49 uto, 9. 6. 2009 Naslov: |
|
|
[quote="Milojko"]zašt se on ljuti zbog toga?[/quote]Zato same konstrukcije scanfa, koja ne samo da je glomazna i prespora za takav trivijalan zadatak, nego je i po defaultu prilicno nesigurna funkcija.
Ako si bas lud za scanfom, razbij to na dva komada, pa koristi vise [code:1]while (getchar() != 10);[/code:1] ili manje [code:1]fflush (stdin);[/code:1] portabilni nacin dobivanja dva (ili vise) charactera scanfom.
IOW:
[code:1]printf("Unesi string:\n");
fgets (s, 77, stdin);
printf("c1: ");
scanf ("%c", &c1);
while (getchar() != 10);
printf("c2: ");
scanf ("%c", &c2);
svrljo(s, c1, c2);[/code:1]
tj.
[code:1]printf("Unesi string:\n");
fgets (s, 77, stdin);
printf("c1: ");
scanf ("%c", &c1);
fflsuh (stdin);
printf("c2: ");
scanf ("%c", &c2);
svrljo(s, c1, c2);[/code:1]
Milojko (napisa): | zašt se on ljuti zbog toga? | Zato same konstrukcije scanfa, koja ne samo da je glomazna i prespora za takav trivijalan zadatak, nego je i po defaultu prilicno nesigurna funkcija.
Ako si bas lud za scanfom, razbij to na dva komada, pa koristi vise Kod: | while (getchar() != 10); | ili manje portabilni nacin dobivanja dva (ili vise) charactera scanfom.
IOW:
Kod: | printf("Unesi string:\n");
fgets (s, 77, stdin);
printf("c1: ");
scanf ("%c", &c1);
while (getchar() != 10);
printf("c2: ");
scanf ("%c", &c2);
svrljo(s, c1, c2); |
tj.
Kod: | printf("Unesi string:\n");
fgets (s, 77, stdin);
printf("c1: ");
scanf ("%c", &c1);
fflsuh (stdin);
printf("c2: ");
scanf ("%c", &c2);
svrljo(s, c1, c2); |
_________________ Biolozi misle da su kemičari. Kemičari misle da su fizičari. Fizičari misle da su bogovi. A Bog misli da je matematičar...
§ http://math2.ath.cx §
|
|
[Vrh] |
|
GauSs_ Moderator


Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol: 
Lokacija: 231
|
Postano: 17:22 uto, 9. 6. 2009 Naslov: |
|
|
[quote="Bubba"][quote="Milojko"]zašt se on ljuti zbog toga?[/quote]Zato same konstrukcije scanfa, koja ne samo da je glomazna i prespora za takav trivijalan zadatak, nego je i po defaultu prilicno nesigurna funkcija.
...[/quote]
ovo sto si napisao za fgets , getchar i slicno je ispravno,
ali odakle ti da je scanf poprilicno nesigurna funkcija?
@ostali:
procitajte [url=http://www.gidnetwork.com/b-60.html]ovo[/url] i nemojte nikada, ali bas [b]nikada[/b], koristiti funkciju [tt]gets[/tt]
Bubba (napisa): | Milojko (napisa): | zašt se on ljuti zbog toga? | Zato same konstrukcije scanfa, koja ne samo da je glomazna i prespora za takav trivijalan zadatak, nego je i po defaultu prilicno nesigurna funkcija.
... |
ovo sto si napisao za fgets , getchar i slicno je ispravno,
ali odakle ti da je scanf poprilicno nesigurna funkcija?
@ostali:
procitajte ovo i nemojte nikada, ali bas nikada, koristiti funkciju gets
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
kenny Petica iz zalaganja


Pridružen/a: 28. 03. 2003. (09:18:36) Postovi: (3B7)16
Spol: 
Lokacija: ...somewhere over the rainbow...
|
|
[Vrh] |
|
Bubba Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12) Postovi: (53)16
Spol: 
|
Postano: 18:32 uto, 9. 6. 2009 Naslov: |
|
|
[quote="GauSs_"]ovo sto si napisao za fgets , getchar i slicno je ispravno,
ali odakle ti da je scanf poprilicno nesigurna funkcija?[/quote]Ovo je provokacija? Jer jednostavno odbijam vjerovati od ovakvo pitanje dolazi od osobe koja ima akademsku kapu ispod forumskog nicknamea i jos uz to, koliko sam shvatio, predaje "programiranje", ali dobro...
Najsmijesnije u citavoj prici jest da nakon pitanja konstatiras kako je gets() losa funkcija, a scanf ("%s", &x) se ponasa *identicno* lose kao gets - ne postoji nikakav suvisli nacin od preveniranja buffer overflowa. Buffer i stack overflowovi su, valjda cemo se sloziti, definitivno najcesce koristeni exploiti, pa je valjda jasno zasto je scanf nista manje opasan od toliko opasnog gets(). Da tu ne dodajem cinjenicu kako valjda u zivotu nisam vidio da bilo koji predavac C-a spominje povratnu vrijednost scanfa, koja je takodjer poprilicno niskorisna jer samo okvirno moze reci je li upit bio uspjesan, a ne dozvoljava gotovo nikakvu detekciju razloga zasto nije, no svejedno...
Problem scanfa je u njegovom imenu - "scan formated". Tko god da je radio bilo kakvu ozbiljniju C aplikaciju koja je zahtijevala stdin unos zna da su korisnici idioti i da je koristenje scanfa ne samo opasno nego i krajnje glupo s programerske tj. developerske strane (jasno, sofisticiraniji nacini unosa jesu kud i kamo kompliciraniji, ali to nije opravdanje).
Drugim rjecima, osim sto je intrinsicno nesiguran, nesiguran je i operativno - moze li si osoba koja je ucena da je scanf etalon unosa sa stdina napraviti gresku koja ce kostati novaca ili jos gore, necije glave (a ne bi bio prvi puta da se takvo sto dogodilo, uopce)?
GauSs_ (napisa): | ovo sto si napisao za fgets , getchar i slicno je ispravno,
ali odakle ti da je scanf poprilicno nesigurna funkcija? | Ovo je provokacija? Jer jednostavno odbijam vjerovati od ovakvo pitanje dolazi od osobe koja ima akademsku kapu ispod forumskog nicknamea i jos uz to, koliko sam shvatio, predaje "programiranje", ali dobro...
Najsmijesnije u citavoj prici jest da nakon pitanja konstatiras kako je gets() losa funkcija, a scanf ("%s", &x) se ponasa *identicno* lose kao gets - ne postoji nikakav suvisli nacin od preveniranja buffer overflowa. Buffer i stack overflowovi su, valjda cemo se sloziti, definitivno najcesce koristeni exploiti, pa je valjda jasno zasto je scanf nista manje opasan od toliko opasnog gets(). Da tu ne dodajem cinjenicu kako valjda u zivotu nisam vidio da bilo koji predavac C-a spominje povratnu vrijednost scanfa, koja je takodjer poprilicno niskorisna jer samo okvirno moze reci je li upit bio uspjesan, a ne dozvoljava gotovo nikakvu detekciju razloga zasto nije, no svejedno...
Problem scanfa je u njegovom imenu - "scan formated". Tko god da je radio bilo kakvu ozbiljniju C aplikaciju koja je zahtijevala stdin unos zna da su korisnici idioti i da je koristenje scanfa ne samo opasno nego i krajnje glupo s programerske tj. developerske strane (jasno, sofisticiraniji nacini unosa jesu kud i kamo kompliciraniji, ali to nije opravdanje).
Drugim rjecima, osim sto je intrinsicno nesiguran, nesiguran je i operativno - moze li si osoba koja je ucena da je scanf etalon unosa sa stdina napraviti gresku koja ce kostati novaca ili jos gore, necije glave (a ne bi bio prvi puta da se takvo sto dogodilo, uopce)?
_________________ Biolozi misle da su kemičari. Kemičari misle da su fizičari. Fizičari misle da su bogovi. A Bog misli da je matematičar...
§ http://math2.ath.cx §
|
|
[Vrh] |
|
GauSs_ Moderator


Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol: 
Lokacija: 231
|
Postano: 20:33 uto, 9. 6. 2009 Naslov: |
|
|
[quote="Bubba"][quote="GauSs_"]ovo sto si napisao za fgets , getchar i slicno je ispravno,
ali odakle ti da je scanf poprilicno nesigurna funkcija?[/quote]Ovo je provokacija? Jer jednostavno odbijam vjerovati od ovakvo pitanje dolazi od osobe koja ima akademsku kapu ispod forumskog nicknamea i jos uz to, koliko sam shvatio, predaje "programiranje", ali dobro...
Najsmijesnije u citavoj prici jest da nakon pitanja konstatiras kako je gets() losa funkcija, a scanf ("%s", &x) se ponasa *identicno* lose kao gets - ne postoji nikakav suvisli nacin od preveniranja buffer overflowa.
[/quote]
Postoji znacajna razlika u implementaciji scanf-a i gets-a,i u praksi bas nisu usporedivi.
"%s" je poprilicno problematican, ponasa se jednako problematicno kao i gets, ali zato postoje stvari poput "%20s" sto je sa gets-om nemoguce izvesti, a sigurne su
[quote="Bubba"] Buffer i stack overflowovi su, valjda cemo se sloziti, definitivno najcesce koristeni exploiti, pa je valjda jasno zasto je scanf nista manje opasan od toliko opasnog gets().
[/quote]
Da, slazemo se da su buffer i stack overflowovi najcesce koristeni exploiti (iako se s randomizacijom stacka u kernelu 2.6 to [b]jako[/b] smanjilo).
[quote="Bubba"]
Da tu ne dodajem cinjenicu kako valjda u zivotu nisam vidio da bilo koji predavac C-a spominje povratnu vrijednost scanfa, koja je takodjer poprilicno niskorisna jer samo okvirno moze reci je li upit bio uspjesan, a ne dozvoljava gotovo nikakvu detekciju razloga zasto nije, no svejedno...
Problem scanfa je u njegovom imenu - "scan formated". Tko god da je radio bilo kakvu ozbiljniju C aplikaciju koja je zahtijevala stdin unos zna da su korisnici idioti i da je koristenje scanfa ne samo opasno nego i krajnje glupo s programerske tj. developerske strane (jasno, sofisticiraniji nacini unosa jesu kud i kamo kompliciraniji, ali to nije opravdanje).
Drugim rjecima, osim sto je intrinsicno nesiguran, nesiguran je i operativno - moze li si osoba koja je ucena da je scanf etalon unosa sa stdina napraviti gresku koja ce kostati novaca ili jos gore, necije glave (a ne bi bio prvi puta da se takvo sto dogodilo, uopce)?[/quote]
Da je [tt]scanf[/tt] uzasna funkcija s gazilion mana stoji, medjutim, sigurnost scanf-a je ipak deliktano pitanje.
Dobro isprogramiran C-program, bez obzira na broj scanf-ova, poprilicno je siguran.
p.s. onaj dio s omalovazavanjem u potpunosti je nepotreban
@ostali: najsigurnija funkcija je fgets i radit cemo ju na sljedecem satu.
to je ujedno i funkcija koju ja preporucam koristiti za "%s" sheme
Bubba (napisa): | GauSs_ (napisa): | ovo sto si napisao za fgets , getchar i slicno je ispravno,
ali odakle ti da je scanf poprilicno nesigurna funkcija? | Ovo je provokacija? Jer jednostavno odbijam vjerovati od ovakvo pitanje dolazi od osobe koja ima akademsku kapu ispod forumskog nicknamea i jos uz to, koliko sam shvatio, predaje "programiranje", ali dobro...
Najsmijesnije u citavoj prici jest da nakon pitanja konstatiras kako je gets() losa funkcija, a scanf ("%s", &x) se ponasa *identicno* lose kao gets - ne postoji nikakav suvisli nacin od preveniranja buffer overflowa.
|
Postoji znacajna razlika u implementaciji scanf-a i gets-a,i u praksi bas nisu usporedivi.
"%s" je poprilicno problematican, ponasa se jednako problematicno kao i gets, ali zato postoje stvari poput "%20s" sto je sa gets-om nemoguce izvesti, a sigurne su
Bubba (napisa): | Buffer i stack overflowovi su, valjda cemo se sloziti, definitivno najcesce koristeni exploiti, pa je valjda jasno zasto je scanf nista manje opasan od toliko opasnog gets().
|
Da, slazemo se da su buffer i stack overflowovi najcesce koristeni exploiti (iako se s randomizacijom stacka u kernelu 2.6 to jako smanjilo).
Bubba (napisa): |
Da tu ne dodajem cinjenicu kako valjda u zivotu nisam vidio da bilo koji predavac C-a spominje povratnu vrijednost scanfa, koja je takodjer poprilicno niskorisna jer samo okvirno moze reci je li upit bio uspjesan, a ne dozvoljava gotovo nikakvu detekciju razloga zasto nije, no svejedno...
Problem scanfa je u njegovom imenu - "scan formated". Tko god da je radio bilo kakvu ozbiljniju C aplikaciju koja je zahtijevala stdin unos zna da su korisnici idioti i da je koristenje scanfa ne samo opasno nego i krajnje glupo s programerske tj. developerske strane (jasno, sofisticiraniji nacini unosa jesu kud i kamo kompliciraniji, ali to nije opravdanje).
Drugim rjecima, osim sto je intrinsicno nesiguran, nesiguran je i operativno - moze li si osoba koja je ucena da je scanf etalon unosa sa stdina napraviti gresku koja ce kostati novaca ili jos gore, necije glave (a ne bi bio prvi puta da se takvo sto dogodilo, uopce)? |
Da je scanf uzasna funkcija s gazilion mana stoji, medjutim, sigurnost scanf-a je ipak deliktano pitanje.
Dobro isprogramiran C-program, bez obzira na broj scanf-ova, poprilicno je siguran.
p.s. onaj dio s omalovazavanjem u potpunosti je nepotreban
@ostali: najsigurnija funkcija je fgets i radit cemo ju na sljedecem satu.
to je ujedno i funkcija koju ja preporucam koristiti za "%s" sheme
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
Bubba Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12) Postovi: (53)16
Spol: 
|
Postano: 21:10 uto, 9. 6. 2009 Naslov: |
|
|
[quote="GauSs_"]Postoji znacajna razlika u implementaciji scanf-a i gets-a,i u praksi bas nisu usporedivi.[/quote]Bez daljnjega. No principijelno, scanf je postao de facto edukativni standard za dohvat znakova iz stdina.
Njegova kompleksnost za pocetnika nije nista manja od elaboracije dohvata nove linije stringa te daljnje baratanje istom za dohvat podataka.
Zasto se opetovano koristi u sve krive namjene (i tu uopce specijalno ne mislim na domaci obrazovni sustav, sto po srednjim, sto po osnovnim skolama) vjerojatno ce ostati misterija.
[quote]"%s" je poprilicno problematican (tu se slazemo i se ponasa jednako glupo kao i gets), ali zato postoje stvari poput "%20s" sto je sa gets-om nemoguce izvesti, a sigurne su[/quote]Istina, no opet, to rjesava samo dio problema koje scanf ima.
O gets(); je bespredmetno i diskutirati, to bez daljnjega.
[quote]Da, slazemo se da su buffer i stack overflowovi najcesce koristeni exploiti (iako se s randomizacijom stacka u kernelu 2.6 to [b]jako[/b] smanjilo).[/quote]Hajde, barem da nesto poprave u toj isprici od kernela...
[quote]Da je [tt]scanf[/tt] uzasna funkcija s gazilion mana stoji, medjutim, sigurnost scanf-a je ipak deliktano pitanje.[/quote]Pa to i jeste sporno.
Vrijedi li uciti ljude scanf(); bez i grama detalja? Stvarno, spominjete li na predavanjima/vjezbama uopce ovakve stvari? Skrece li se ljudima paznaj na to?
Lijepo je bubati algoritme, preskakati zabe i jos sto stvari, ali to su trice i kucine koje malo kvalitetniji Google bot moze pokrawlati za 15 mikrosekundi. Napisati *kvalitetan* C program je... well, da ne ispadnem pomahnitao, ali skoro "umjetnost".
[quote]Dobro isprogramiran C-program, bez obzira na broj scanf-ova, poprilicno je siguran.[/quote]Word!
Ali koliko je ljudi u ovom threadu napravilo elementarnu scanf gresku?
[quote]p.s. onaj dio s omalovazavanjem u potpunosti je nepotreban[/quote]Svecano obecajem da nikada vise neci omalovazavati scanf. To nije bilo uredu od mene. Svaka funkcija ima pravo biti bugoviti mastodont sa najcesce krivom primjenom. Nadam se da ce mi K&R otpustiti grijehe moje. :)
[b]=======[/b]
[b]mod edit:[/b] nastavak OT-a na temi [url=http://degiorgi.math.hr/forum/viewtopic.php?t=13253]"nastavni problemi s C-om"[/url]
GauSs_ (napisa): | Postoji znacajna razlika u implementaciji scanf-a i gets-a,i u praksi bas nisu usporedivi. | Bez daljnjega. No principijelno, scanf je postao de facto edukativni standard za dohvat znakova iz stdina.
Njegova kompleksnost za pocetnika nije nista manja od elaboracije dohvata nove linije stringa te daljnje baratanje istom za dohvat podataka.
Zasto se opetovano koristi u sve krive namjene (i tu uopce specijalno ne mislim na domaci obrazovni sustav, sto po srednjim, sto po osnovnim skolama) vjerojatno ce ostati misterija.
Citat: | "%s" je poprilicno problematican (tu se slazemo i se ponasa jednako glupo kao i gets), ali zato postoje stvari poput "%20s" sto je sa gets-om nemoguce izvesti, a sigurne su | Istina, no opet, to rjesava samo dio problema koje scanf ima.
O gets(); je bespredmetno i diskutirati, to bez daljnjega.
Citat: | Da, slazemo se da su buffer i stack overflowovi najcesce koristeni exploiti (iako se s randomizacijom stacka u kernelu 2.6 to jako smanjilo). | Hajde, barem da nesto poprave u toj isprici od kernela...
Citat: | Da je scanf uzasna funkcija s gazilion mana stoji, medjutim, sigurnost scanf-a je ipak deliktano pitanje. | Pa to i jeste sporno.
Vrijedi li uciti ljude scanf(); bez i grama detalja? Stvarno, spominjete li na predavanjima/vjezbama uopce ovakve stvari? Skrece li se ljudima paznaj na to?
Lijepo je bubati algoritme, preskakati zabe i jos sto stvari, ali to su trice i kucine koje malo kvalitetniji Google bot moze pokrawlati za 15 mikrosekundi. Napisati *kvalitetan* C program je... well, da ne ispadnem pomahnitao, ali skoro "umjetnost".
Citat: | Dobro isprogramiran C-program, bez obzira na broj scanf-ova, poprilicno je siguran. | Word!
Ali koliko je ljudi u ovom threadu napravilo elementarnu scanf gresku?
Citat: | p.s. onaj dio s omalovazavanjem u potpunosti je nepotreban | Svecano obecajem da nikada vise neci omalovazavati scanf. To nije bilo uredu od mene. Svaka funkcija ima pravo biti bugoviti mastodont sa najcesce krivom primjenom. Nadam se da ce mi K&R otpustiti grijehe moje.
=======
mod edit: nastavak OT-a na temi "nastavni problemi s C-om"
_________________ Biolozi misle da su kemičari. Kemičari misle da su fizičari. Fizičari misle da su bogovi. A Bog misli da je matematičar...
§ http://math2.ath.cx §
|
|
[Vrh] |
|
indexnet Forumaš(ica)

Pridružen/a: 25. 11. 2008. (13:41:53) Postovi: (46)16
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
komaPMF Forumaš(ica)


Pridružen/a: 22. 11. 2007. (10:23:41) Postovi: (E6)16
Spol: 
Lokacija: Over the roof
|
Postano: 16:23 pet, 12. 6. 2009 Naslov: |
|
|
[code:1]#include<stdio.h>
#include<stdlib.h>
void tr (char s[], char f[], char t[])
{
int i, j;
for (i=0; s[i]!='\0'; i++)
for (j=0; f[j]!='\0'; j++)
{
if (s[i]==f[j])
{
s[i]=t[j];
break;
}
}
printf ("%s", s);
}
int main(){
char s[20];
char f[20], t[20];
scanf ("%[^\n]", s);
//printf ("Prva rijec: %s", s);
scanf (" %[^\n]", f);
//printf ("Druga rijec: %s", f);
scanf (" %[^\n]", t);
//printf ("Treca rijec: %s", t);
system ("PAUSE");
return 0;
}
[/code:1]
Sigurno neka najgluplja greška, ali neće učitati, a stavih razmak u 2. i 3. scanf-u :? i javlja mi grešku kod poziva funkcije
ispravih funkciju, kad čovjek radi gro izmjena pa zaboravi popraviti što treba...ali opet mi neće učitati sve stringove
i još nešto...dok napišem const char f i t, javlja grešku, kao da mu to smeta
zaboravih inicijalizirati string s kao niz, s[20]...kako glupa greška :oops:
[size=9][color=#999999]Added after 11 minutes:[/color][/size]
ispravih...sad radi kako treba...
pitam se zašto uvijek glupe greške skontam tek dok pošaljem na forum, a prije toga se pitam i pitam što ne valja :oops:
Kod: | #include<stdio.h>
#include<stdlib.h>
void tr (char s[], char f[], char t[])
{
int i, j;
for (i=0; s[i]!='\0'; i++)
for (j=0; f[j]!='\0'; j++)
{
if (s[i]==f[j])
{
s[i]=t[j];
break;
}
}
printf ("%s", s);
}
int main(){
char s[20];
char f[20], t[20];
scanf ("%[^\n]", s);
//printf ("Prva rijec: %s", s);
scanf (" %[^\n]", f);
//printf ("Druga rijec: %s", f);
scanf (" %[^\n]", t);
//printf ("Treca rijec: %s", t);
system ("PAUSE");
return 0;
}
|
Sigurno neka najgluplja greška, ali neće učitati, a stavih razmak u 2. i 3. scanf-u i javlja mi grešku kod poziva funkcije
ispravih funkciju, kad čovjek radi gro izmjena pa zaboravi popraviti što treba...ali opet mi neće učitati sve stringove
i još nešto...dok napišem const char f i t, javlja grešku, kao da mu to smeta
zaboravih inicijalizirati string s kao niz, s[20]...kako glupa greška
Added after 11 minutes:
ispravih...sad radi kako treba...
pitam se zašto uvijek glupe greške skontam tek dok pošaljem na forum, a prije toga se pitam i pitam što ne valja
_________________ Granice mogućega možemo odrediti samo onda ako ih prijeđemo odlaskom u nemoguće
|
|
[Vrh] |
|
|