PDA

Tam Sürümünü Görmek İçin : NUL karakteri


RaiST
24/04/2004, 17:09
C'de bildiginiz gibi NUL karakter, string termination olarak algılanır, string fonksiyonları kullanarak bir string icinde 0x00 kullanmaya calıstıgınızda sorunlar yasarsınız. cozum icin; memcpy tarzı fonk.lar gerekir.
Peki variable argument alabilen bir memcpy turevi mevcutmu? veyada bunla ilgili kaynak bilenler varmı?


RaiST
24/04/2004, 18:57
Tamam; kendi strcpy'imi yazdım:


int strcpy_offset(char * dest,const char *src,int offset,int len)
{
char *temp=&dest[offset];
int i;

for(i=0;i<len;i++)
{
*temp=*src;
temp+=1;
src+=1;
}

return offset+len;
}


4 arguman alıyor;
hedef, kaynak, offset, uzunluk

normalde strcpy uzunluk bilgisi istemez cunki bir
while( (*temp++=*src++)!='\0') dongusu kullanır ve 0x00 gordugunde durum. ama zaten bızım amacımız \0ları gordugunde durmaması. bunun ıcın kopylamak istedigimiz miktar verilmeli.

ornek kullanım:

offset=0;
offset=strcpy_offset(data,"hus1",offset,4);
offset=strcpy_offset(data,"\0hus1",offset,5);
boylece sonucta data icinde "hus1\0hus2" kopyalanmıs olacaktır.

umarım bende baska birilerininde isine yarar.

Kögüdey Meygen
24/04/2004, 20:50
İşlevin dönüş değerinin amacını tam olarak anlayamadım?
Dödürdüğü değer ne oluyor?
offset+len =?

l
------------------
Şöyle birşey genel amaca daha uygun olur.

int strcpy_offset(char * dest,const char *src,int offset,int len)
{
char *temp=&dest[offset];//bu satira gerek yok, dest+=offset yeterli
int i;

#ifdef HATA_AYIKLA
if(dest==NULL)fprintf(stderr,"Uygulamada büyük ihtimalle hata var\n");
if(src==NULL)fprintf(stderr,"Uygulamada büyük ihtimalle hata var\n");
#endif

for(i=0;i<len;i++)
{
*temp=*src;//burada temp yerine dest kullanilabilir
temp+=1;
src+=1;
}

return offset+len;
}

RaiST
24/04/2004, 20:52
suki; destinatıonda kaldıgımız yeri belirtiyor;
boylece birdahaki cagrısınızda bu degeri vererek, yeni kopylanacak degeri ustune yazmak yerine eski kaldıgı yerden yazmıs oluyor..

aslında fonksıyonu gelıstırmek mumkun. official strcpy gibi destination (char *) geri dondurebiliriz. bunun icin offseti int * tanımlayabiliriz mesela.
zamanım pek olmadıgı icin bunu yapamadım. ama gerekirse yapabiliriz.

Kögüdey Meygen
24/04/2004, 21:00
Genel amaca yönelik bir strcpy yerine, galiba daha özel bir amaca yönelik bir strcpy galiba bu.

Euclides
24/04/2004, 21:32
memcpy'den farkını halen çözbilmiş değilim ??

ozgan
24/04/2004, 23:35
su sekilde kendi fonksiyonum vardi:

int *strcpy(char *s,char *t){
char *ptr=s;
while(*s++ = *t++)
;
return(ptr);
}

RaiST
24/04/2004, 23:37
evet cok fazla bir farkı yok..

olay su; variable argument bir olay lazımdı bana. vsnprintfi duzeltmeyi dusundum ama cok uzun oldugu icin strcpyi duzeltmeye karar cerdim.. sonucta memcpyi de offsetli hale getirebilirdim..

burdaki olay offset olayı. yanı bir nevı "variable argument"un yamulmus bir turevi :P

RaiST
24/04/2004, 23:40
su sekilde kendi fonksiyonum vardi:

int *strcpy(char *s,char *t){
char *ptr=s;
while(*s++ = *t++)
;
return(ptr);
}

allah allah bu direkt libc'deki strcpyye benziyor.

yanlız nasıl oluyorda char* int* olarak donuyor?
bu different return type olarak bir warning verecektir

ozgan
24/04/2004, 23:51
:D orada yanlis yazmisim :D