08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

türden bir adrestir. Eğer aranan byte bulunamaz ise işlev NULL adresine geri döner.<br />

İşlevin başarısı mutlaka sınanmalıdır. İşlev aşağıdaki gibi tanımlanabilir:<br />

void *mymemchr(const void *p_block, int c, unsigned int nbytes)<br />

{<br />

const char *p = p_block;<br />

}<br />

while (nbytes--) {<br />

if (*p == c)<br />

return (void *)p;<br />

p++;<br />

}<br />

return NULL;<br />

memcmp işlevi<br />

Standart bir C işlevidir. Adresleri verilen iki bellek bloğunu karşılaştırmak amacıyla<br />

kullanılır. İşlevin string.h başlık dosyası içindeki bildirimi aşağıdaki gibidir:<br />

int memcmp(const void *pblock1, const void *pblock1, unsigned int nbytes);<br />

İşlev block1 ve block2 adreslerinden başlayan nbytes büyüklüğündeki iki bloğu<br />

karşılaştırır. İşlevin geri dönüş değeri int türdendir. Geri dönüş değerinin yorumlanması<br />

standart strcmp işlevine benzer:<br />

İki bellek bloğu tamamen aynıysa, yani iki bloktaki tüm byte'lar birbirine eşitse, işlev 0<br />

değerine geri döner.<br />

Birinci bellek bloğu ikinci bellek bloğundan daha büyükse işlev 0'dan büyük bir değere<br />

geri döner. Birinci bellek bloğu ikinci bellek bloğundan daha küçükse işlev 0'dan küçük bir<br />

değere geri döner. Karşılaştırma şöyle yapılır: Bloklar düşük sayısal adreslerden<br />

başlayarak byte byte işaretsiz tamsayı olarak karşılaştırılır. Farklı olan ilk byte ile<br />

karşılaşıldığında, daha büyük olan tamsayıya sahip blok daha büyüktür.<br />

İşlev aşağıdaki gibi tanımlanabilir:<br />

int mymemcmp(const void *vp1, const void *vp2, size_t nbytes)<br />

{<br />

const unsigned char *p1 = vp1;<br />

const unsigned char *p2 = vp2;<br />

unsigned int k;<br />

for (k = 0; k < nbytes; ++k)<br />

if (p1[k] != p2[k])<br />

return p1[k] < p2[k] ? -1 : 1;<br />

}<br />

return 0;<br />

Aşağıda yazılan işlevi sınayan bir main işlevi yazılıyor:<br />

int main()<br />

{<br />

unsigned char s1[100] = {0};<br />

unsigned char s2[100] = {0};<br />

if (!mymemcmp(s1, s2, 100))<br />

printf("bloklar esit!\n");<br />

s1[90] = 1;<br />

288

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!