[ IvanBeograd @ 15.03.2006. 22:05 ] @
Ne vidim gde je greska,f-ja brisi bi trebalo da obrise svaki znak iz stringa S koji odgovara bilo kom znaku u stringu T.
npr S="prva",T="drug", da neko novo N="pva"!Znam da je neka glupa greska,ali me je izmucila.

Code:

#include<stdio.h>

void brisi(char *s,char *t,char *v)
{
  for( ; *s!='\0' ; s++){
   for( ; *t!='\0' && *t!=*s ; t++);
    if(*t=='\0') *v++=*s;
   }
  *v='\0';
}

void main()
{
  char p[]="prva",d[]="drug",n[10];
  brisi(p,d,n);
  printf("Nova niska je : %s\n",n);

  getchar();
}


Hvala na odgovorima,pozdrav!
[ Pharos @ 15.03.2006. 22:33 ] @
Greška je u drugoj for petlji.
Jednom dođeš do kraja niza i više se ne vraćaš na početak.
Probaj ovako:
Code:

#include<stdio.h>

void brisi(char *s,char *t,char *v)
{
    int pozicija = t;
  for( ; *s!='\0' ; s++){
   for(t=pozicija ; *t!='\0' && *t!=*s ; t++);
    if(*t=='\0') *v++=*s;
   }
  *v='\0';
}

void main()
{
  char p[]="prva",d[]="druag",n[10];
  brisi(p,d,n);
  printf("Nova niska je : %s\n",n);

  getchar();
}


[Ovu poruku je menjao Pharos dana 15.03.2006. u 23:42 GMT+1]
[ IvanBeograd @ 15.03.2006. 22:52 ] @
Cek malo,kako mozes da kazes :
Code:

 int pozicija = t;

???Mislim da to tvoje nece raditi!!!Ipak hvala na pokusaju!
[ Pharos @ 15.03.2006. 23:00 ] @
Aj ti to lepo kompajliraj pa reci dal radi ili ne radi.
Malo pre sam objasnio zašto. Ako ti nije jasno, pokazacu ti na nekom prostijem primeru.

pOz
[ WEXY @ 15.03.2006. 23:01 ] @
Code:
char *pozicija = t;


Mislim da je ovako korektnije i očiglednije.
[ IvanBeograd @ 15.03.2006. 23:10 ] @
Pa pogresio si covece ne mozes da mesas babe i zabe!
Code:

int pozicija = t;

pozicija je integer,a t je string!Necu ni da probam da kompajliram!Sta da mi expoldira racunar??? :-)
Hvala WEXY,radi!
Hvala puno na pomoci,kontam gde sam pogresio,pozzzz!

[Ovu poruku je menjao IvanBeograd dana 16.03.2006. u 00:11 GMT+1]
[ WEXY @ 15.03.2006. 23:21 ] @
Um.. pa.., t nije string već pokazivač na char (sadrži adresu jednog podatka tipa char).
Radilo bi ti i ovo što je Pharos napisao međutim ne mora int da bude 4 bajta uvek (može da bude 2 ili 4 zavisno od kompajlera), a na 64bitnoj mašini, pošto se adresira sa 8bajtova ne možeš u int da smestiš celu adresu, zato je bolje da koristis ono što sam ja rekao čisto zbog portabilnosti, a i očiglednije je.

[Ovu poruku je menjao WEXY dana 16.03.2006. u 00:24 GMT+1]
[ Pharos @ 16.03.2006. 09:49 ] @
Ivane, Ivane...
Ne znam kako ja to mešam babe i žabe. Vidim da opet ne razumeš.
Ajde ipak da ti pojasnim.
s ti je niz karaktera {'p', 'r', 'v', 'a', '\0'}, jel tako?
t ti je niz karaktera {'d', 'r', 'u', 'g', '\0'}, jel tako?
Zatim imaš prvu for petlju koja se šeta kroz niz dok ne dođe do kraja niza (*s!='\0' pošto je 0 oznaka za kraj niza).
To si isto mogao napisati pomoću while petlje.
Code:

while(*s!='\0'){
// Ovde ide kod druge for petlje

s++;
}


Drugom for petljom ideš do kraja niza na isti način kao i prvom for petljom petljom.
To isto predstavljeno pomoću while petlje bi izgledalo ovako:
Code:

while(*t!='\0' && *t!=*s){
if(*t=='\0')*v++=*s;
t++;
}


Sad sve to zajedno izgleda ovako:

Code:

while(*s!='\0'){
while(*t!='\0' && *t!=*s){
if(*t=='\0')*v++=*s;
t++;
}
s++;
}


Kako to radi? Idemo korak po korak.
Prvo se pročita prvi karakter iz prvog niza. Zatim se pokreće druga while petlja. Iz druge petlje se išcitava karakter po karakter i ako se poklope 2 ista karakter vrši se "brisanje". Zašto pod znacima navoda? Pa zato što je drugi niz prazan. Novi element se dodaje iz niza s samo ako se taj isti element na nalazi u nizu t. Mislim da je to jasno.
E sad, pošto si završio sa drugom while petljom, vraćaš se na početak prve while petlje. Čita se sledeci element iz niza s i pokreće se druga while petlja. Kao što vidimo, pokazivač *t se nalazi na poslednjem elementu u nizu. U našem primeru to je slovo (karakter) g. I tako sve do kraja.

Izlaz programa je:
Code:

Nova niska je : prva

Dakle, niz je ne promenjen zato što se u nizu s na mestu prvog elementa u nizu ne nalazi elemnt koji jednak nekom od elemenata iz niza t, a na ostalim mestima u nizu s se ne nalazi ni jedan element koji je jednak poslednjem elementu u nizu t.
Probajmo na mesto poslednjeg elementa u nizu t staviti neki karakter iz niza s i uporedite rezultat.

U čemu je greška gorepomenutog koda? U tome što se pokretanjem druge while petlje, svaki put mora poći od početka niza, odnosno pogrešno je ispitivati samo poslednji element niza. Kako reći drugoj while petlji da počne s ispitivanjem od početka niza?
Pre pokretanja while petlje moramo zapamtiti adresu prvog elementa niza. To prosto uradimo ovako:
Code:

const long adresa = t;

Naš program bi izgledao ovako.
Code:

const long adresa = t;
while(*s!='\0'){
t = adresa;
while(*t!='\0' && *t!=*s){
if(*t=='\0')*v++=*s;
t++;
}
s++;
}


Sad sve to isto kompletirano i uradeno preko for petlji izgleda ovako:
Code:

#include<stdio.h>

void brisi(char *s,char *t,char *v)
{
    const long adresa = t;
  for( ; *s!='\0' ; s++){
   for(t=adresa; *t!='\0' && *t!=*s ; t++);
    if(*t=='\0') *v++=*s;
   }
  *v='\0';
}

void main()
{
  char p[]="prva",d[]="druag",n[10];
  brisi(p,d,n);
  printf("Nova niska je : %s\n",n);

  getchar();
}


Ako nekom i dalje nije jasno, predlažem da malo prelista Ricijevu knjigu programski jezik C, gde je odlično opisan rad s pointerima.

edit:

Namerno nije rađeno sa
char* adresa = t;
odnosno const char* adresa = t;
kako bi trebalo, već je odrađeno onako kako sam napisao.
Zašto? Čovek očigledno ne zna da barata sa pointerima. Poenta je da vidi kako to radi.
char *t;
*t je pokazivač na neki podatak tipa char, a samo t je adresa tog podatka u memoriji.
Prihvatam WEXY-jevu kritiku da ne radim sa int već sa long, međutim nikad nisam imao problema.
Radi savršeno, a uvek radim s jednim kompajlerom i na jednoj platformi, no ako ćemo ići u detalje... :D
Toliko od mene. Milsim da je dosta. Nauči ti to lepo, pa tek kad naučiš onda ispravljaj i reci da mešam babe i žabe.

pOz

[Ovu poruku je menjao Pharos dana 16.03.2006. u 11:14 GMT+1]
[ IvanBeograd @ 16.03.2006. 11:59 ] @
Ajde molim te iskompajliraj ono tvoje sto si prvo napisao,a moze i ovo drugo!
Mozda zato sto ja koristim borlandov c kompajler,a nece ni u trubo c-u da radi tvoj primer!
Kontam ja tebe sve!Ali ti mene ne kontas!Samo iskompajliraj!Ono sto je WEXY napisao to radi!
Hvala ti ipak puno,greska je bila moja!
[ Pharos @ 16.03.2006. 12:34 ] @
Iskompajlirano pomoću VS 2003 i Dev C++ final version.
Zaključak, radi.
Naravno da je mnogo pravilnije ono što je napisao WEXY i tako se radi.
Kao što rekoh, namerno sam onako napisao da shvatiš šta se dešava i gde je greška.
[ IvanBeograd @ 16.03.2006. 12:47 ] @
Pa kontam ja ono sve stp si napisao,greska je bila u for petlji,i pogresno sam se izrazio bio,a ne u sustini pokazivaca
i kretanja kroz for petlju!Jednostavno sam zaboravi da treba da zapamtim pocetnu poziciju,jer sam ranije radio to preko nizova,a ne preko pokazivaca!
Primer koji ne radi u borlandovom c builder-u,meni nista ne vredi ako on radi u VS 2003 i Dev C++.Meni koliko treba C,jeste samo onoliko,koliko,primere koje ja napisem,treba da rade u borlandovom c builder-u!
Zato sam ti i rekao da nemesas baba i zabe zato sto sam mislio da ne moze,a izgleda da moze! :)Nadam se da me sad kontas!Hvala puno na odgovorima!Pozdrav!

[Ovu poruku je menjao IvanBeograd dana 16.03.2006. u 13:56 GMT+1]
[ leka @ 16.03.2006. 13:02 ] @
Ako zelite da sve radi kako valja, slusacete wexy-ja i staviti char *pozicija = t; tamo gde treba. :)

Sto se Pharaos-a tice:
Citat:

Namerno nije rađeno sa
char* adresa = t;
odnosno const char* adresa = t;
kako bi trebalo, već je odrađeno onako kako sam napisao.
Zašto? Čovek očigledno ne zna da barata sa pointerima. Poenta je da vidi kako to radi.
char *t;

Nakon citanja tvog koda on je jos vise bio zbunjen. Dakle taj pristup nije dobar iz bar dva razloga - prvi je taj sto covek nije nista naucio, samo je jos vise bio zbunjen, a drugi je da tvoj kod nece raditi svuda kako treba.

[Ovu poruku je menjao leka dana 16.03.2006. u 14:08 GMT+1]
[ Pharos @ 16.03.2006. 13:29 ] @
A jel ti čitaš malo?
Ponavljaš ono što je napisano već x puta.
Pišem zadnji put.
Ide char *pozicija=t; tamo gde treba. Tako bi trebalo da se radi jer je pravilnije.
Pokazivač vraćaš na početak niza i sve radi. Kompajleri se ne bune. Ja sam to uradio na drugi način koji se ne preporučuje i to sam naglasio u svakom postu. Sad što to neko kapira, a neko ne kapira, ili što jedan kompajler uredno kompajlira, a drugi ne, nije moj problem. Hteo sam čoveku da skrenem pažnju na algoritamsku grešku.
Uvek pišite char * pozicija = t, umesto const long int = t; U redu?

Izvinjavam se svima koje sam zbunio i one koji će zbog mene napustiti C! :D

edit:

Greške u mom kodu nema, samo što se tako ne bi trebalo raditi iz gorepomenutih razloga sa š kompajlerima.
Ako napišeš char *pozicija = t; Koji je pozicija tip podatka? I gde je greška?
A zašto jedan kompajler kompajlira uredno, a drugi ne, i koji kompajler je bliži standardu, a koji ne, mislim da nije tema ovog posta.


[Ovu poruku je menjao Pharos dana 16.03.2006. u 14:43 GMT+1]
[ leka @ 16.03.2006. 13:54 ] @
To sto se nesto moze iskompajlirati bez greske ne znaci da greske ne moze biti...
[ darkon @ 17.03.2006. 09:49 ] @
Čemu dve for petlje?
Funkcija radi sasvim lepo i ovako:
Code:
void brisi(char *s, char *t, char *v)
{
  for( ; *s!='\0'; s++, t++)
    if(*s!=*t)
        *v++=*s;
  *v='\0';
}


[Ovu poruku je menjao darkon dana 17.03.2006. u 10:51 GMT+1]
[ WEXY @ 20.03.2006. 23:25 ] @
Ne radi sasvim lepo jer ne upoređuje svaki znak iz prvog stringa sa svakim znakom iz drugog stringa. Upoređuje samo tekuće karaktere.

Za ulazne podatke p[] = "psva" i d[] = "vsua" dobija se "pv", a treba samo "p".
[ Mali Misha @ 21.03.2006. 15:58 ] @
Pamcenje char* je moguce sa long int (ako se bas mora) i ostalim sredstvima koja raspolazu istom ili vecom kolicinom memorije ali zasto kada je najprostiji char* lepo dostupan. Inace preporucujem koriscenje const:

Code:
void brisi(const char *s,const char *t,char *v)
{
    const char *tt;
    
    while(*s)
    {
        for(tt=t;*tt;tt++)
        {
            if(*tt == *s) break;
        }

        if(!*tt)
        {
            *(v++) = *s;
        }

        s++;
    }

    *v = 0;
}