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]