Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Stringovi
WWW:
Idite na 1, 2, 3  Sljedeće
Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Tygy
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 22. 11. 2008. (15:27:08)
Postovi: (102)16
Sarma = la pohva - posuda
= 17 - 14

PostPostano: 13:46 ned, 7. 6. 2009    Naslov: Stringovi Citirajte i odgovorite

krenula učit za kolokvij...pa imam nekih nejasnoća...
kad idem sortirati niz riječi "ključni dio" je :
if (strcasecmp(niz(i),niz(j))>0) onda ti obavi zamjenu.
ono sto mene zanima je kako ovo funkcionira? s obzirom da ova funkcija uspoređuje dvije riječi... kak se s tim može sortirat niz po abecedi...
ili po drugom ili zadnjem slovu....
nadam se da je pitanje dovoljno jasno
:roll:

(nisam bila na tim vježbama....)
krenula učit za kolokvij...pa imam nekih nejasnoća...
kad idem sortirati niz riječi "ključni dio" je :
if (strcasecmp(niz(i),niz(j))>0) onda ti obavi zamjenu.
ono sto mene zanima je kako ovo funkcionira? s obzirom da ova funkcija uspoređuje dvije riječi... kak se s tim može sortirat niz po abecedi...
ili po drugom ili zadnjem slovu....
nadam se da je pitanje dovoljno jasno
Rolling Eyes

(nisam bila na tim vježbama....)


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 14:00 ned, 7. 6. 2009    Naslov: Re: pomoć Citirajte i odgovorite

[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 Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Tygy
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 22. 11. 2008. (15:27:08)
Postovi: (102)16
Sarma = la pohva - posuda
= 17 - 14

PostPostano: 11:10 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

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? Laughing

4. zasto je uz ime funkcije (u tim veznim listama) znakic *....?
-kako to funkcionira?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
kenny
Petica iz zalaganja
Petica iz zalaganja


Pridružen/a: 28. 03. 2003. (09:18:36)
Postovi: (3B7)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
43 = 94 - 51
Lokacija: ...somewhere over the rainbow...

PostPostano: 12:50 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[quote="Tygy"]
a pitanje je:
je li if ( ! first ) isto kao if (fist!=0)

[/quote]

Ako first trenutno ima vrijednost 0, onda je !first 1, pa će se if blok u prvom slučaju izvršiti.

U drugom slučaju... Ako je first trenutno 0, onda 0!=0 daje 0 (jer to nije istinito!), pa se if blok neće izvršiti.

ukratko - if(!first) je isto što i if(first=0)
Tygy (napisa):

a pitanje je:
je li if ( ! first ) isto kao if (fist!=0)



Ako first trenutno ima vrijednost 0, onda je !first 1, pa će se if blok u prvom slučaju izvršiti.

U drugom slučaju... Ako je first trenutno 0, onda 0!=0 daje 0 (jer to nije istinito!), pa se if blok neće izvršiti.

ukratko - if(!first) je isto što i if(first=0)



_________________
Dvije stvari su beskonacne: svemir i ljudska glupost. Za ono prvo nisam siguran.

by A.Einstein
[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3561)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 13:33 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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). Cool

Sto se NULL-a tice, on je ovako nesto:
#define NULL ((void *)0),
dakle nula castana na pointer. Cool

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

Tygy (napisa):
3.kad pretipkam zadatak 7.1 iz skripte, ne radi zbog dijela brisanja liste...jel nesto nevalja u skripti? Laughing


Moguce, no cini mi se da sam to testirao kad sam pisao. Ja to stvarno ne znam Provjeri je l' tocno prepisano, reci sto ti javlja, copy-paste-aj svoj kod ovdje,... Smile

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. Confused Pazi:
nesto *f(...)
znaci da funkcija vraca vrijednost tipa nesto*, isto kao sto
int *x;
znaci da je x varijabla tipa "pointer na int". Cool



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Milojko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2008. (14:57:52)
Postovi: (453)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
17 = 68 - 51
Lokacija: Hilbertov hotel

PostPostano: 14:45 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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 Smile

Bolonja je smeće i to pod hitno treba mijenjat
[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3561)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 15:10 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

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



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Milojko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2008. (14:57:52)
Postovi: (453)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
17 = 68 - 51
Lokacija: Hilbertov hotel

PostPostano: 15:19 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

:oops:
tnx
zašt se on ljuti zbog toga?
Embarassed
tnx
zašt se on ljuti zbog toga?



_________________
Sedam je prost broj Smile

Bolonja je smeće i to pod hitno treba mijenjat
[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3561)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 15:37 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

Ne ljuti se, nego ucita tocno sto si mu rekao: iduci znak (dakle, tvoj [tt]enter[/tt]). 8)
Ne ljuti se, nego ucita tocno sto si mu rekao: iduci znak (dakle, tvoj enter). Cool



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Bubba
Forumaš s poteškoćama u pisanju
Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12)
Postovi: (53)16
Spol: muško
Sarma = la pohva - posuda
10 = 27 - 17

PostPostano: 15:49 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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
Kod:
fflush (stdin);
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]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
GauSs_
Moderator
Moderator


Pridružen/a: 28. 01. 2004. (21:01:17)
Postovi: (53C)16
Spol: muško
Sarma = la pohva - posuda
72 = 110 - 38
Lokacija: 231

PostPostano: 17:22 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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
Malo sam lose volje...

Prosle su godine kolokviji bili laksi, zar ne?
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
kenny
Petica iz zalaganja
Petica iz zalaganja


Pridružen/a: 28. 03. 2003. (09:18:36)
Postovi: (3B7)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
43 = 94 - 51
Lokacija: ...somewhere over the rainbow...

PostPostano: 17:34 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[quote="vsego"][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)
[/quote]

ups, moram priznati da sam C zadnji put radio u gimnaziji, a na faxu sam polagao Pascal, pa eto....malo sam zaboravio :D Hvala vsego na ispravku!
vsego (napisa):
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). Cool


ups, moram priznati da sam C zadnji put radio u gimnaziji, a na faxu sam polagao Pascal, pa eto....malo sam zaboravio Very Happy Hvala vsego na ispravku!



_________________
Dvije stvari su beskonacne: svemir i ljudska glupost. Za ono prvo nisam siguran.

by A.Einstein
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Bubba
Forumaš s poteškoćama u pisanju
Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12)
Postovi: (53)16
Spol: muško
Sarma = la pohva - posuda
10 = 27 - 17

PostPostano: 18:32 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
GauSs_
Moderator
Moderator


Pridružen/a: 28. 01. 2004. (21:01:17)
Postovi: (53C)16
Spol: muško
Sarma = la pohva - posuda
72 = 110 - 38
Lokacija: 231

PostPostano: 20:33 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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
Malo sam lose volje...

Prosle su godine kolokviji bili laksi, zar ne?
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Bubba
Forumaš s poteškoćama u pisanju
Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12)
Postovi: (53)16
Spol: muško
Sarma = la pohva - posuda
10 = 27 - 17

PostPostano: 21:10 uto, 9. 6. 2009    Naslov: Citirajte i odgovorite

[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. Smile

=======

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]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
indexnet
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 11. 2008. (13:41:53)
Postovi: (46)16
Sarma = la pohva - posuda
= 10 - 4

PostPostano: 21:39 čet, 11. 6. 2009    Naslov: Citirajte i odgovorite

jeli mi može netko ukazati na gresku. probao sam implementirat strcpy sa pokazivačima.
[code:1]
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char *strcopy(char *s, const char *t) {
while(*t != '\0') {
*s++ = *t++;
}
return s;
}

int main(void) {
char *s, *t;
printf("unesite string: ");
gets(t);

strcopy(s, t);

printf("ispisani string koji je kopiran u drugi string\n");
printf("%s", s);

system("pause");
return 0;
}
[/code:1]
jeli mi može netko ukazati na gresku. probao sam implementirat strcpy sa pokazivačima.
Kod:

#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char *strcopy(char *s, const char *t) {
     while(*t != '\0') {
           *s++ = *t++;
           }
     return s;
}

int main(void) {
    char *s, *t;
    printf("unesite string: ");
    gets(t);
   
    strcopy(s, t);
   
    printf("ispisani string koji je kopiran u drugi string\n");
    printf("%s", s);
   
    system("pause");
    return 0;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3561)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 21:41 čet, 11. 6. 2009    Naslov: Citirajte i odgovorite

Ne skopiras [tt]'\0'[/tt]. 8)

[tt]while (*s = *t++);[/tt] bi trebalo raditi (pazi: jedno "jednako"). :)
Ne skopiras '\0'. Cool

while (*s = *t++); bi trebalo raditi (pazi: jedno "jednako"). Smile



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 22:16 čet, 11. 6. 2009    Naslov: Citirajte i odgovorite

[quote="vsego"]
[tt]while (*s = *t++);[/tt] bi trebalo raditi (pazi: jedno "jednako"). :)[/quote]
Actually, [tt]while (*s[color=red]++[/color] = *t++);[/tt] bi trebalo raditi.
vsego (napisa):

while (*s = *t++); bi trebalo raditi (pazi: jedno "jednako"). Smile

Actually, while (*s++ = *t++); bi trebalo raditi.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3561)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 1:04 pet, 12. 6. 2009    Naslov: Citirajte i odgovorite

Yes, of course. :oops: Thanx! :D
Yes, of course. Embarassed Thanx! Very Happy



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
komaPMF
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 22. 11. 2007. (10:23:41)
Postovi: (E6)16
Spol: žensko
Sarma = la pohva - posuda
-5 = 8 - 13
Lokacija: Over the roof

PostPostano: 16:23 pet, 12. 6. 2009    Naslov: Citirajte i odgovorite

[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 Confused 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 Embarassed

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 Embarassed



_________________
Granice mogućega možemo odrediti samo onda ako ih prijeđemo odlaskom u nemoguće
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Idite na 1, 2, 3  Sljedeće
Stranica 1 / 3.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan